PostgreSQL - 按时间戳值分组?

Posted

技术标签:

【中文标题】PostgreSQL - 按时间戳值分组?【英文标题】:PostgreSQL - GROUP BY timestamp values? 【发布时间】:2011-10-13 12:54:54 【问题描述】:

我有一张表,其中存储了采购订单。每行都有一个时间戳,指示下订单的时间。我希望能够创建一份报告,表明每天、每月或每年的购买次数。我想我会做一个简单的 SELECT COUNT(xxx) FROM tbl_orders GROUP BY tbl_orders.purchase_time 并获取值,但事实证明我不能 GROUP BY 时间戳列。

还有其他方法可以做到这一点吗?理想情况下,我想要一个灵活的解决方案,这样我就可以使用我需要的任何时间范围(每小时、每月、每周等)。感谢您提供的任何建议!

【问题讨论】:

当您尝试按时间戳列分组时会出现什么错误?它似乎在这里工作正常,请记住时间戳必须相同(精确到微秒,或任何最小分辨率)才能被分组。 【参考方案1】:

没有 date_trunc 函数就可以解决问题(更容易阅读)。

// 2014
select created_on::DATE from users group by created_on::DATE

// updated September 2018 (thanks to @wegry)
select created_on::DATE as co from users group by co

我们在这里所做的是将原始值转换为 DATE,从而使该值中的时间数据变得无关紧要。

【讨论】:

正是我想要的,转换为“2016-06-27”之类的日期,易于快速计算(*)按天 我认为将时间戳类型转换为 DATE 在 Group By 中不起作用,因为它不适合我。 @hky404 我让它在选择中使用别名,然后在 GROUP BY 中使用该别名。 select created_on::DATE as co from users group by co @wegry 谢谢!我用您的解决方案更新了答案。我猜 Postgres 在我发布后的 5 年内更新了。 月份和年份的工作原理是什么?它抛出了一个错误时间戳::月【参考方案2】:

在这里按时间戳列分组对我来说很好,请记住,即使是 1 微秒的差异也会阻止两行被分组在一起。

要按较大的时间段进行分组,请按时间戳列上返回适当截断值的表达式进行分组。 date_trunc 在这里很有用,to_char 也可以。

【讨论】:

date_trunc 函数正是我想要的。谢谢!

以上是关于PostgreSQL - 按时间戳值分组?的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL 分组错误

PostgreSQL 按总和分组

按 15 分钟间隔对 mysql 查询进行分组

按 PostgreSQL 中的指定列分组

PostgreSQL 按纪元月分组

PostgreSQL 按特定条件分组并计数