2013-10-21 12 views
0

我正在創建統計模塊。我的一項工作就是在過去的一週內爲註冊用戶創造情節。
問題是我的工作只是爲了少數客戶使用的服務,所以幾乎沒有人經常發生註冊事件。在執行GROUP BY的同時選擇零值

表描述(簡體)是:

TABLE users: 
============ 
id serial NOT NULL, 
date_created timestamp with timezone NOT NULL DEFAULT NOW() 

獲得資金近7天內,我用

SELECT 
    COUNT(id) as ile, 
    DATE_TRUNC('day', date_created) as day 
FROM 
    users 
WHERE 
    date_created >= now() - INTERVAL '7 days' 
GROUP BY 2 
ORDER BY 2 

一切正常,Postgres的返回例如:

ile | day 
=========================== 
2 | "2013-09-23 00:00:00" 
1 | "2013-09-25 00:00:00" 

除了用0計數來忽略天數。 當然,我必須解析這個查詢的結果(在這種情況下:PHP + Symfony),所以我可以迭代通過期望的日期範圍並填充空白,但我想知道是否有簡單方式要求PostgreSQL做到這一點我,所以它返回是這樣的:

ile | day 
=========================== 
2 | "2013-09-23 00:00:00" 
0 | "2013-09-24 00:00:00" 
1 | "2013-09-25 00:00:00" 
0 | "2013-09-26 00:00:00" 
0 | "2013-09-27 00:00:00" 
0 | "2013-09-28 00:00:00" 
0 | "2013-09-29 00:00:00" 

回答

1

目前無法測試,但您可以使用generate_series()功能:

select 
    count(u.id) as ile, 
    d.day 
from generate_series('2013-09-23'::date, '2013-09-29'::date, '1d') as d(day) 
    left outer join users as u on u.date_created >= d.day and u.date_created < d.day + '1d'::interval 
    -- or left outer join users as u on date_trunc('day', u.date_created) = d.day 
    -- but I think that >= and < will be faster if you have index on `date_created` 
group by d.day 
+1

老實說,我不知道,我可以執行與加盟> =或<。這是星期一,我今天學到了一些新東西。謝謝! :)查詢的作品,但不完美 - 它給出了錯誤的結果,我想這是因爲generate_series返回時間戳與時區,並有時間戳**沒有**用戶關係時區...但我想這是我會挖我。十分感謝! – ex3v