2016-12-18 61 views
1

我試圖使用Knex在多個天內按小時對記錄進行分組。因此,例如上午9時將是:總計數在多個天和小時

{ 
    hour: 9AM, // for days 12/11, 12/12, 12/13 
    count: 10 // 10 Ids total over those days for hour 9AM 
} 

在此快照鑑於記錄,我怎麼能聚合他們進入跨越多天hour桶?

enter image description here

如果我輸出的查詢結果,你可以看到19:0012/1212/13兩個獨立的結果。這兩天計數需要被彙總到一個hour 19:00分組:

ROWS [ anonymous { 
    session_ids: [ 3200 ], 
    hour: 2016-12-12T14:00:00.000Z, 
    count: '1' }, 
    anonymous { 
    session_ids: [ 3201 ], 
    hour: 2016-12-12T15:00:00.000Z, 
    count: '1' }, 
    anonymous { 
    session_ids: [ 3203, 3202 ], 
    hour: 2016-12-12T19:00:00.000Z, 
    count: '2' }, 
    anonymous { 
    session_ids: [ 3204, 3205 ], 
    hour: 2016-12-13T19:00:00.000Z, // This count should be aggregated into the `19:00` grouping above 
    count: '2' } ] 

我當前的查詢:

var qry = db.knex 
    .select(db.knex.raw("array_agg(t2.id) as session_ids, date_trunc('hour', t2.start_timestamp) as hour")) 
    .count('*') 
    .from('sessions as t2') 
    .groupByRaw("date_trunc('hour', t2.start_timestamp)") 
    .orderBy(db.knex.raw("date_trunc('hour', t2.start_timestamp)")); 

回答

4

使用EXTRACT,不date_trunc

var qry = db.knex 
    .select(db.knex.raw("array_agg(t2.id) as session_ids, extract('hour' from t2.start_timestamp) as hour")) 
    .count('*') 
    .from('sessions as t2') 
    .groupByRaw("extract('hour' from t2.start_timestamp)") 
    .orderBy(db.knex.raw("extract('hour' from t2.start_timestamp)")); 

date_trunc截斷時間戳到指定的精度(意爲GROUP BY將無法​​工作,因爲兩個時間戳用相同的「時間」字段的日子可能仍然會有所不同):

SELECT date_trunc('hour', NOW()); 
┌────────────────────────┐ 
│  date_trunc  │ 
├────────────────────────┤ 
│ 2016-12-18 19:00:00+01 │ 
└────────────────────────┘ 
(1 row) 

EXTRACT獲取特定領域你要求爲:

SELECT extract('hour' from NOW()); 
┌───────────┐ 
│ date_part │ 
├───────────┤ 
│  19 │ 
└───────────┘ 
(1 row) 
+0

@Growler:錯過了'ORDER BY'子句中的'date_trunc'。我修好了它。 – Marth

+0

這太好了。什麼是'date_trunc'對那麼好? 「你提到你要求的特定領域是什麼意思」? 'trunc'也不會產生'19小時'嗎? – Growler

+0

@Growler:你可以看到'date_trunc'在你的問題的''hour''字段中返回什麼。當你想比較兩個時間戳和一點餘地時,它會很有用:例如,如果你只想比較日期到分鐘,你可以使用'date_trunc('minute',ts)= date_trunc(...)',這將丟棄秒/毫秒精度(在檢查相等之前,將它們設置爲0)。 – Marth