每天的时间范围计数

Counts for time range per day

我有一个 table 像这样的东西

create table widgets
(
   id primary key,
   created_at timestamp,
   -- other fields
)

现在我想要一个查询,显示每天多个时间范围内具有 created_at 的小部件的计数。例如,00:00:00 和 11:59:59 之间的 created_at 的小部件计数和 12:00:00 和 23:59:59 之间的计数。输出看起来像这样:

date           | morning widgets (before noon) | evening widgets (after noon) |
---------------|-------------------------------|------------------------------|
2022-05-01     |            ##                 |           ##                 |
2022-05-02     |            ##                 |           ##                 |
2022-05-03     |            ##                 |           ##                 |
2022-05-04     |            ##                 |           ##                 |
... etc.

到目前为止,我发现我每天可以获得计数:

select created_at::date as created_at_date, count(*) as total
from widgets
where created_at::date >= '2022-05-01' -- where clause for illustration purposes only and not critical to the central question here
group by created_at::date

我正在学习窗口函数,特别是 partition by。我认为这会帮助我得到我想要的东西,但不确定。我该怎么做?

我更喜欢“标准 SQL”解决方案。如有必要,我在 postgres 上,可以使用任何特定于其 SQL.

风格的东西

如果我没理解错的话,可以尝试使用条件window函数来制作

  • morning widgets (before noon) : 在 00:00:00 和 11:59:59
  • 之间
  • evening widgets (after noon) : 在 12:00:00 和 23:59:59
  • 之间

通过CASE WHEN表达式将条件放入聚合函数中。

SELECT created_at::date,
       COUNT(CASE WHEN created_at >= created_at::date AND created_at <=  created_at::date + INTERVAL '12 HOUR' THEN 1 END) ,
       COUNT(CASE WHEN created_at >= created_at::date + INTERVAL '12 HOUR' AND  created_at <= created_at::date+ INTERVAL '1 DAY' THEN 1 END)
FROM  widgets w
GROUP BY created_at::date
ORDER BY created_at::date

sqliddle