每天的时间范围计数
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
我有一个 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