2016-12-18 4 views
1

Knexを使用して複数の日に渡って1時間ごとにレコードをグループ化しようとしています。したがって、たとえば、午前9時は次のようになります。複数の日と1時間ごとの合計の合計数

{ 
    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

I出力クエリの結果ならば、あなたは12/12ため19:0012/13するための2つの別々の結果を見ることができます。

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)")); 

これらの2日間のカウントが1つのhour 19:00グループに加算する必要がありますdate_truncは、(同じ「時間」フィールドを持つ2つのタイムスタンプの日はまだ異なる場合がありますよう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'も' 19th'時間をもたらすのではないでしょうか? – Growler

+0

@Growler:あなたの質問の「時」フィールドに 'date_trunc'が返すものを見ることができます。これは、2つのタイムスタンプを少しの余裕と比較したいときに便利です:たとえば、日付を分だけ比較する場合、 'date_trunc( 'minute'、ts)= date_trunc(...)'を使用して、これは秒/ミリ秒精度を破棄します(等しいかどうかを確認する前に両側を0に設定します)。 – Marth

関連する問題