如何使用Postgres中的时间戳字段来分组日期?

时间:2018-02-17 13:04:36

标签: sql postgresql select group-by

假设我有3行数据:

id  product_uuid                version_uuid                created_at
22  586d8e21b9529d14801b91bd    5a711a0094df04e23833d8ef    2018-02-10 19:51:15.075-05
23  586d8e21b9529d14801b91bd    5a711a0094df04e23833d8ef    2018-02-10 19:51:16.077-07
24  586d8e21b9529d14801b91bd    5a711a0094df04e23833d8ef    2018-02-11 19:51:15.077-05

我希望白天通过created_at列对它们进行分组。

SELECT created_at::date, COUNT(*)
FROM table_name
WHERE product_uuid = '586d8e21b9529d14801b91bd'
AND created_at > now() - interval '30 days'
GROUP BY created_at
ORDER BY created_at ASC

我希望这会产生2行:

created_at   count
2018-02-10   2
2018-02-11   1

但我实际得到3行:

created_at   count
2018-02-10   1
2018-02-10   1
2018-02-11   1

我意识到GROUP BY仍然按细粒度时间戳进行分组,但我不确定如何让Postgres使用截断日期代替。

3 个答案:

答案 0 :(得分:5)

您还需要在GROUP BY中截断:

SELECT created_at::date, COUNT(*)
FROM table_name
WHERE product_uuid = '586d8e21b9529d14801b91bd' AND
      created_at > now() - interval '30 days'
GROUP BY created_at::date
ORDER BY created_at::date ASC;

您的版本按每个日期/时间值汇总,但仅显示日期组件。

此外,我建议您使用current_date而不是now(),这样第一个日期就不会被截断。

答案 1 :(得分:1)

您可以按个别时间戳(包括一天中的时间)查询组,然后将它们转换为分组后的日期。如果您想要每个日期使用rwo,则应将转换添加到date子句中的group by

SELECT   created_at::date, COUNT(*)
FROM     table_name
WHERE    product_uuid = '586d8e21b9529d14801b91bd'
AND      created_at > now() - interval '30 days'
GROUP BY created_at::date -- Here!
ORDER BY created_at 1 ASC

答案 2 :(得分:0)

您需要将format日期作为字符串。所以这样做:

SELECT to_char(created_at,'YYYY-MM-DD'), COUNT(*) AS `Count`
FROM table_name
WHERE product_uuid = '586d8e21b9529d14801b91bd'
AND created_at > now() - interval '30 days'
GROUP BY to_char(created_at,'YYYY-MM-DD')
ORDER BY to_char(created_at,'YYYY-MM-DD') ASC;
相关问题