sql - LEFT JOIN 使用子查询不返回空结果为 "0"

标签 sql postgresql

我正在编写一个查询,用于搜索 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/

相关文章:

sql - PostgreSQL 是否共享 CTE 的顺序?

django - 在 Django 数据迁移中手动提交

Python 将 float 写入 Postgresql,但精度较低

sql - PostgreSQL 是否具有在单个查询中多次更新同一行的机制?

postgresql - GoLang PGX PostgreSQL

sql - 如何从 '@'符号开始输出email信息,不考虑记录长度

sql - 显示最后一天每小时创建的行数,未创建行时计数为 0

sql - 如何授予表 "select"的公共(public)同义词 "SHC.ABC"的 "SHC.ABC"权限

c# - 使用 odbc 在 csv 文件中执行 SQL 查询

postgresql - mix ecto.create 失败 (** (Postgrex.Error) FATAL 28000 (invalid_authorization_specation) 用户“postgres”的身份验证失败