【发布时间】:2017-10-22 19:44:34
【问题描述】:
我在 Postgres 数据库中有一个简单的表 log,如下所示(为示例而简化):
time::timestamptz
action::varchar
time | action
2017-10-16 17:14:49.473903-08 | 'some action'
2017-10-16 17:14:49.473903-08 | 'some other action'
2017-10-17 17:14:49.473903-08 | 'some action'
//etc.
有各种各样的动作。我想查询此表以每天获取一行,其中一列包含每个操作的计数数组。这是我想要的结果:
day actions
'2017-10-08' | [{"action":"some action", "count":10},
| {"action":"some other action", "count":20}}]
'2017-10-09' | [{"action":"some action", "count":15},
| {"action":"some other action", "count":18}}]
我几乎可以用这个到达那里:
SELECT day, json_agg(act) as actions
FROM (
SELECT action, time::date as day, COUNT(*)
FROM log_hits
GROUP BY (action, day)
) act
GROUP BY day
当然,这会导致actions数组中每个对象出现日期……
day actions
'2017-10-08' | [{"action":"some action", day:"2017-10-08", "count":10},
| {"action":"some other action", day:"2017-10-08", "count":20}}]
...这是多余的(并且可能效率低下)。获取按天分组的结果的正确方法是什么,这一天只出现在它自己的列中,而操作聚合只针对那一天?
【问题讨论】:
-
什么 postgres 版本?
-
@Mihai 我正在运行 9.6
标签: sql json postgresql aggregate-functions