2013-11-28 45 views
1

我正在使用PostgreSQL 9.3和大約7M行的表。Postgresql時間片/窗口查詢

我想獲得每個device_group上的每個表的記錄數。

我想我的結果集看起來像這樣:

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; 

回答

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 
; 

演示: - >http://www.sqlfiddle.com/#!15/4a3ef/7

+0

哇,我肯定是過度思考這一個。我已經測試過了,它給了我需要的結果。謝謝! – krunchyklown