2016-08-17 263 views
0

的一天,我有一個表conversationsinserted_at集團通過

我想提請顯示的conversations隨着時間的推移產生量的圖表。

我希望能夠按任意日期,星期和日期時間的數據,以顯示可能的趨勢。

我將使用7天,1個月和6個月的時間間隔。

實施例:

間隔:1 month組由day of week

我想是這樣

| Monday | Tuesday | Wednesday | Thursday | Friday | 
|--------|---------|-----------|----------|--------| 
| 11  | 22  | 19  | 17  | 10  | 

或間隔:7 days組由date

| 1/1 | 2/1 | 3/1 | 4/1 | 5/1 | 6/1 | 7/1 | 
|-----|-----|-----|-----|-----|-----|-----| 
| 11 | 22 | 19 | 17 | 10 | 10 | 7 | 

我是實現這個目標的最好方法(例子將不勝感激),並且PostgreSQL適合這些查詢?

最後,是有指標的任何特殊種類,這將提高此類查詢?

+0

看起來像某種'樞軸'問題。 – jarlh

+0

不重複。這不是一個關鍵問題。這只是聚合。 –

回答

2

星期幾:

select 
    count(extract(dow from inserted_at) = 1 or null) as monday, 
    count(extract(dow from inserted_at) = 2 or null) as tuesday, 
    count(extract(dow from inserted_at) = 3 or null) as wednesday, 
    count(extract(dow from inserted_at) = 4 or null) as thursday, 
    count(extract(dow from inserted_at) = 5 or null) as friday, 
from conversations 

count只能算作not null值。 false or nullnull因此只有true將被計數。

在新版本中有一個聚集filter

count(*) filter (where extract(dow from inserted_at) = 4) as thursday 
+1

爲什麼'或null'條件? – dnoeth

+0

@dnoeth更新 –

+0

哇,這是棘手的三值邏輯:)我可能會繼續我的'計數(情況下,當提取物(道瓊斯指數從inserted_at)= 1,則1月底)' – dnoeth

1

一個簡單的group by會做的伎倆:

select 
    extract(dow from inserted_at) 
    , count(*) 
from conversations 
where inserted_at between date '2016-08-08' and '2016-08-08' + interval '7 days' 
group by 1; 

這查詢的改進版本(以確保與數天0也包括在內):

with week as 
(
    SELECT s.d day FROM generate_series(1,7) s(d) 
) 
select 
    week.day 
    , count(extract(dow from c.inserted_at)) 
from days 
left join conversations c on week.day = extract(dow from c.inserted_at) 
    and c.inserted_at between now() and now() + interval '7 days' 
group by week.day 
order by week.day; 

上的索引列將有助於快速選擇相關時間間隔。

+0

會是有意義的上'道瓊斯指數因爲它只有7個可能的值,即。選擇性相對較低? – Tarlen

+0

是的,第二個想法是「dow」的索引可能不是最好的主意。 – binoternary