我正在使用PostgreSQL 9.3,其表格大约有7M行。
我想计算每个设备组每天的表中记录数。
我希望我的结果集看起来像这样:
device_group.id | date | count
-------------------------------------
123 | 2013-11-28| 45
123 | 2013-11-29| 37
124 | 2013-11-28| 4
124 | 2013-11-29| 23
125 | 2013-11-28| 3
每个device_group的每日计数可用作结果集中的记录。
理想情况下,我可以传递一个开始和结束日期,以确定结果集中每个device_group应该有多少个日期记录。
我不介意结果集是否省略了计数为零的记录。
表格的基本形式如下:
CREATE TABLE session (
id SERIAL PRIMARY KEY,
acctstarttime TIMESTAMP,
deviceid INTEGER (FOREIGN KEY)
);
CREATE TABLE device_group (
id SERIAL PRIMARY KEY,
name TEXT
);
CREATE TABLE device (
id SERIAL PRIMARY KEY,
device_group_id INTEGER (FOREIGN KEY)
name TEXT
);
我使用了窗口函数,我可以得到一个按日期细分的全局数字,或者一个按device_group_id划分的数字,但不能合并......而这就是我被困住的地方。
到目前为止我一直在做的事情:
SELECT
device_group_id,
COUNT(s.id)
OVER (PARTITION BY deviceid)
FROM session s
LEFT JOIN device d ON s.deviceid = d.id
WHERE acctstarttime > '2013-11-01' AND acctstarttime < '2013-11-28'
ORDER BY device_group_id;
和
SELECT
TO_TIMESTAMP( EXTRACT ('epoch' FROM acctstarttime)::int / (86400) * 86400 ) AS timeslice,
COUNT(username)
FROM session
WHERE acctstarttime > '2013-11-01' AND acctstarttime < '2013-11-28'
GROUP BY timeslice
ORDER BY timeslice ASC;
答案 0 :(得分:1)
对于此任务,只需简单的GROUP BY查询:
select d.device_group_id,
date_trunc( 'day', s.acctstarttime ) date,
count(*)
from device d
join session s
on d.id = s.deviceid
group by d.device_group_id,
date_trunc( 'day', s.acctstarttime )
order by d.device_group_id, date
;
和另一个带有WHERE子句的版本
select d.device_group_id,
date_trunc( 'day', s.acctstarttime ) date,
count(*)
from device d
join session s
on d.id = s.deviceid
where acctstarttime between
to_timestamp('2013-01-01', 'yyyy-mm-dd')
and
to_timestamp('2014-01-01', 'yyyy-mm-dd')
group by d.device_group_id,
date_trunc( 'day', s.acctstarttime )
order by d.device_group_id, date
;
演示: - &gt; http://www.sqlfiddle.com/#!15/4a3ef/7