我正在编写一个查询,用于搜索 parking 罚单数据库并计算每刻钟发出的罚单数量。
这里有两个事件部件。子查询使用 generate_series 生成 15 分钟增量时间戳并将其存储为“timestep”。然后,外部查询使用另一个时间戳语句加入,该语句将所有内容四舍五入到最低的刻钟。
现在,它不会将空结果返回为“0”,这正是我试图通过连接实现的。
本质上,我正在寻找这样的输出:
12:00: 0 12:15: 10 12:45: 5 13:00: 0
...and so on.
SELECT count(*), timer.timestep
FROM violations
left join (SELECT (hourstep || ':' || minutestep)::time AS timestep
from generate_series(0,23) AS hourstep,
generate_series(0,59, 15) AS minutestep)
AS timer
ON timer.timestep =
(extract(hour from violations."InfractionTime")
|| ':' ||
((extract(minute FROM violations."InfractionTime")::int / 15)*15))::time
GROUP BY timer.timestep
最佳答案
我认为问题在于您将 VIOLATIONS 表作为左侧表,因此它是加入时间步长结果集的基础。如果没有违规记录,它不关心你的时间步结果中是否有条目。
我反转了,所以你的左侧表是时间步长的表,所以你总是得到所有 15 分钟的间隔......然后 LEFT JOIN 违规。如果没有违规的记录,它应该保留时间段,但你要查找的时间段为零。
SELECT
timer.timestep,
count(*)
FROM
( SELECT
(hourstep || ':' || minutestep)::time AS timestep
from
generate_series(0,23) AS hourstep,
generate_series(0,59, 15) AS minutestep) AS timer
LEFT JOIN violations
ON timer.timestep =
(extract(hour from violations."InfractionTime")
|| ':' ||
((extract(minute FROM violations."InfractionTime")::int / 15)*15))::time
group by
timer.timestep
关于sql - LEFT JOIN 使用子查询不返回空结果为 "0",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20310026/