多天和按小时分组的总计数
sum counts across multiple days and group by hour
我正在尝试使用 Knex 跨多天按小时对记录进行分组。因此,例如,上午 9 点将是:
{
hour: 9AM, // for days 12/11, 12/12, 12/13
count: 10 // 10 Ids total over those days for hour 9AM
}
鉴于此快照中的记录,我如何将它们聚合到多天的 hour
个存储桶中?
如果我输出查询结果,您可以看到 12/12
和 12/13
的 19:00
两个单独的结果。这两天的计数需要合计为一个 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)"));
使用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
将不起作用,因为具有相同 'hour' 字段的两个时间戳的天数可能仍然不同) :
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)
我正在尝试使用 Knex 跨多天按小时对记录进行分组。因此,例如,上午 9 点将是:
{
hour: 9AM, // for days 12/11, 12/12, 12/13
count: 10 // 10 Ids total over those days for hour 9AM
}
鉴于此快照中的记录,我如何将它们聚合到多天的 hour
个存储桶中?
如果我输出查询结果,您可以看到 12/12
和 12/13
的 19:00
两个单独的结果。这两天的计数需要合计为一个 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)"));
使用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
将不起作用,因为具有相同 'hour' 字段的两个时间戳的天数可能仍然不同) :
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)