相关疑难解决方法(0)

最大数量 每天的并发用户会话数

情况

我们有一个PostgreSQL 8.4数据库,其中包含用户会话,其中包含登录日期/时间和每行注销日期/时间.我们的Web应用程序会记录此次并处理用户未明确注销的情况(会话超时).因此,每种情况下都会给出登录日期/时间和注销日期/时间.

目标

我需要每天最大并发会话数的用户统计信息.所以,我可以说以下内容:"在2015年3月16日同时在线用户峰值登录为6."

类似的问题

这里回答了一个类似的问题:每天每小时SQL最大并发会话 但是,我无法使解决方案适应我的情况,我希望有一个结果表,显示最大值.每天并发用户会话数,而不是每小时.表格方案也略有不同,因为我的案例中的一行包含登录和注销日期/时间,而在示例中,每行代表登录或注销.此外,该问题基于MS SQL数据库环境而不是PostgreSQL.

注意事项

  • 不同用户的会话可以重叠
  • 用户可能有重复会话,只应计数一次(按用户名分组)
  • 会话表的表格方案如下所示

表格方案:

user_id     |  login_date  |  login_time  |  logout_date  |  logout_time
------------+--------------+--------------+---------------+-------------
USER32      |  2014-03-03  |    08:23:00  |   2014-03-03  |     14:44:00
USER82      |  2014-03-03  |    08:49:00  |   2014-03-03  |     17:18:00
USER83      |  2014-03-03  |    09:40:00  |   2014-03-03  |     17:31:00
USER36      |  2014-03-03  |    09:50:00  |   2014-03-03  |     16:10:00
USER37      |  2014-03-03  |    11:44:00  |   2014-03-03  |     15:21:00
USER72      |  2014-03-03  |    12:52:00  |   2014-03-03 …
Run Code Online (Sandbox Code Playgroud)

sql postgresql aggregate-functions overlap window-functions

5
推荐指数
1
解决办法
3541
查看次数

平均库存历史表

我有一个表格,用于跟踪某些商店和产品的库存随时间的变化。该值是绝对库存,但我们仅在库存发生变化时插入新行。这种设计是为了保持表较小,因为预计它会快速增长。

这是一个示例架构和一些测试数据:

CREATE TABLE stocks (
  id serial NOT NULL,
  store_id integer NOT NULL,
  product_id integer NOT NULL,
  date date NOT NULL,
  value integer NOT NULL,
  CONSTRAINT stocks_pkey PRIMARY KEY (id),
  CONSTRAINT stocks_store_id_product_id_date_key 
    UNIQUE (store_id, product_id, date)
);

insert into stocks(store_id, product_id, date, value) values
(1,10,'2013-01-05', 4),
(1,10,'2013-01-09', 7),
(1,10,'2013-01-11', 5),
(1,11,'2013-01-05', 8),
(2,10,'2013-01-04', 12),
(2,11,'2012-12-04', 23);
Run Code Online (Sandbox Code Playgroud)

我需要能够确定每个产品和商店的开始日期和结束日期之间的平均库存,但我的问题是简单的 avg() 没有考虑到库存在更改之间保持不变。

我想要的是这样的:

select s.store_id,  s.product_id , special_avg(s.value) 
from stocks s where s.date between '2013-01-01' and '2013-01-15'
group by s.store_id,  s.product_id
Run Code Online (Sandbox Code Playgroud)

结果是这样的: …

sql postgresql average date-range window-functions

4
推荐指数
1
解决办法
2072
查看次数

从now()函数中减去小时数

我们有一台24x7全天候运行的机器.每天我都会报告每小时生产的件数.在我们的例子中,一个工作日意味着'2015-06-16 06:00:00'到'2015-06-17 06:00:00'.

这是我的代码:

select date_trunc('hour', t_el_eventlog.eventtime at time zone 'CET') as hours,
       count (distinct t_el_eventlog.serialnumber) as count
from t_el_eventlog
where eventtime at time zone 'CET' between '2015-06-16 06:00:00'
                                       and '2015-06-17 06:00:00'
and sourceid = '44'
group by hours
order by hours asc
Run Code Online (Sandbox Code Playgroud)
  • 我的Postgres版本:"PostgreSQL 9.4.1,由Visual C++编译构建1800,32位"

  • 我正在处理的两列数据类型:

    eventtime timestamp without time zone
    sourceid  integer NOT NULL
    
    Run Code Online (Sandbox Code Playgroud)
  • 时区是"欧洲/柏林".

通过上面的查询,我得到了我想要的信息,但我必须每天更改日期.是否可以将该now()功能用作我的情况的默认值,这样我就不必每天手动更改日期?

sql postgresql timezone datetime date-arithmetic

4
推荐指数
2
解决办法
2万
查看次数

优化BETWEEN日期声明

我需要帮助优化PostgreSQL查询,该查询使用BETWEEN带有timestamp字段的子句.

我有2张桌子:

ONE(int id_one(PK), datetime cut_time, int f1 . . .) 
Run Code Online (Sandbox Code Playgroud)

包含大约3394行

TWO(int id_two(PK), int id_one(FK), int f2 . . .) 
Run Code Online (Sandbox Code Playgroud)

包含大约4000000行

有两个的PK B树索引id_oneid_two,在FK id_onecut_time.

我想执行如下查询:

select o.id_one, Date(o.cut_time), o.f1, t.f2 
from one o
inner join two t ON (o.id_one = t.id_one)
where o.cut_time between '2013-01-01' and '2013-01-31';
Run Code Online (Sandbox Code Playgroud)

此查询在大约7秒内检索大约1.700.000行.

报告分析报告下面报告:

"Merge Join  (cost=20000000003.53..20000197562.38 rows=1680916 width=24) (actual time=0.017..741.718 rows=1692345 loops=1)"
"  Merge Cond: (c.coilid = hf.coilid)"
"  ->  Index Scan …
Run Code Online (Sandbox Code Playgroud)

sql postgresql indexing between postgresql-performance

3
推荐指数
1
解决办法
7303
查看次数

开放时间的非重叠,连续时间戳范围(tstzrange)

CREATE TABLE operating_period (
  id SERIAL NOT NULL PRIMARY KEY,
  during TSTZRANGE NOT NULL,
  -- other meta fields
);
Run Code Online (Sandbox Code Playgroud)

要求:1.运营期间不得相互重叠

题:

  1. 如何添加约束以确保在运行时间内没有重叠?
  2. 在查询速度方面,我最好用两列(start_at, end_at)还是GIST索引快速tstzrange
  3. 在架构设计中,tstzrange常用吗?或者我最好用两列?

postgresql indexing database-design range-types

2
推荐指数
1
解决办法
1511
查看次数

PostgreSQL函数,select返回一个值

我有一张桌子years(每只耳朵的1号).我想创建一个函数,它接受这些年中的每一年并在另一个表上运行查询来计算属于该年份的行数.我尝试用pl/pgsql实现,使用下面的代码,但我没有让它工作或在Internet上找到任何引用.

CREATE or REPLACE FUNCTION func_test(in AAA date, OUT _result int) 
BEGIN
   SELECT SUM(st_length(geom)) as BBB
   FROM hist_line
   WHERE '2006-01-01' BETWEEN valid_from AND COALESCE(valid_to, '9999-12-31');
   RETURN _result BBB;
END;
$$ LANGUAGE plpgsql;
CREATE or REPLACE FUNCTION func_test(date) 

select func_test('2009-01-01');
Run Code Online (Sandbox Code Playgroud)

我无法将函数内部的内容查询恢复为函数的输出.

sql postgresql plpgsql sql-function

0
推荐指数
1
解决办法
7483
查看次数