情况
我们有一个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) 我有一个表格,用于跟踪某些商店和产品的库存随时间的变化。该值是绝对库存,但我们仅在库存发生变化时插入新行。这种设计是为了保持表较小,因为预计它会快速增长。
这是一个示例架构和一些测试数据:
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)
结果是这样的: …
我们有一台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()功能用作我的情况的默认值,这样我就不必每天手动更改日期?
我需要帮助优化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_one和id_two,在FK id_one和cut_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) CREATE TABLE operating_period (
id SERIAL NOT NULL PRIMARY KEY,
during TSTZRANGE NOT NULL,
-- other meta fields
);
Run Code Online (Sandbox Code Playgroud)
要求:1.运营期间不得相互重叠
题:
(start_at, end_at)还是GIST索引快速tstzrange?tstzrange常用吗?或者我最好用两列?我有一张桌子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)
我无法将函数内部的内容查询恢复为函数的输出.
postgresql ×6
sql ×5
indexing ×2
average ×1
between ×1
date-range ×1
datetime ×1
overlap ×1
plpgsql ×1
range-types ×1
sql-function ×1
timezone ×1