sql - 如何在 Postgres 中使用时间戳字段按日期分组?

标签 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 使用截断日期。

最佳答案

您还需要在 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(),这样第一个日期就不会被截断。

关于sql - 如何在 Postgres 中使用时间戳字段按日期分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48841591/

相关文章:

sql - 调用存储过程插入多个值

sql - 带有 SQL 查询的函数没有结果数据的目的地

sql - 使用腻子将结果保存在平面文件中

django - 如何与 docker 共享本地 Postgres 数据库?

sql - 我们如何向结果集中添加一列以显示 PostgreSQL 中的计数?

mysql - 如何从基于其他 3 个表的表中选择数据?

MySQL - 选择行程次数最多但不重复的项目

sql - 循环索引变量使用在 PL/SQL 集合中无效

mysql select not 不起作用

javascript - 使用 jquery 在选择框中填充值和文本