如何使此查询也返回计数值为 0 的行?

Posted

技术标签:

【中文标题】如何使此查询也返回计数值为 0 的行?【英文标题】:how to make this query also return rows with 0 count value? 【发布时间】:2012-08-01 14:12:48 【问题描述】:

我编写了一个小型 PostgreSQL 查询,它可以帮助我在两个特定日期内每天每小时间隔执行的作业总数 - 例如2012 年 2 月 2 日至 2012 年 3 月 3 日期间执行的所有作业,从 2 月 2 日给出的小时开始,到 3 月 3 日给出的小时结束 - 我注意到此查询不会打印计数为 0 的行- 在该时间间隔内没有执行任何作业,例如2012 年 2 月 21 日下午 5 点到 6 点之间。我怎样才能使它也返回计数为 0 的结果(行)?代码如下:

SELECT date_trunc('hour', executiontime), count(executiontime)
  FROM mytable
 WHERE executiontime BETWEEN '2011-2-2 0:00:00' AND '2012-3-2 5:00:00' 
 GROUP BY date_trunc('hour', executiontime)
 ORDER BY date_trunc('hour', executiontime) ASC;

提前致谢。

【问题讨论】:

您需要一个数字表来生成每小时的行数,然后外连接到 mytable 以获取计数。 【参考方案1】:
        -- CTE to the rescue!!!
WITH cal AS (
        SELECT generate_series('2012-02-02 00:00:00'::timestamp , '2012-03-02 05:00:00'::timestamp , '1 hour'::interval) AS stamp
        )
, qqq AS (
        SELECT date_trunc('hour', executiontime) AS stamp
        , count(*) AS zcount
        FROM mytable
        GROUP BY date_trunc('hour', executiontime)
        )
SELECT cal.stamp
        , COALESCE (qqq.zcount, 0) AS zcount
FROM cal
LEFT JOIN qqq ON cal.stamp = qqq.stamp
ORDER BY stamp ASC
        ;

【讨论】:

这给出了以下语法错误 ERROR: syntax error at or near "WITH cal" LINE 8: WITH cal AS (尽管出于某种原因与 PostgreSQL 文档中的 CTE 示例相同。跨度> 我有 8.3,这应该是问题所在。谢谢。 标准技巧是用(临时)视图替换 CTE 并参考这些。但那样会失去很多优雅。顺便说一句:我建议升级到 9.1.x。只需要一个小时左右的工作,值得。 那我安装 9.1.x 试试答案。顺便说一句,这是否适合非常大规模的数据-因为我正在查看约 250 万个总查询,如果我每天按小时检索它们,它们是约 10.5k 行(并且这个数字可能会增加)-而且我的初始代码检索整个数据(比我的问题中给出的日期时间参数略长的时间跨度,时间戳是参数化的,并且可以使用来自 Qt 前端的用户输入选择任何两个数据间隔。大约 5 秒。跨度> 别忘了备份(你需要从备份中恢复才能进行迁移!)性能不是问题;规划器优化器将视图和 CTE 视为主查询的一部分,并愉快地重新排列它们,就好像它们是普通的子查询一样。对于 (MegaRow * KiloRow) 连接,使用正确的结构和调整亚秒级计时是可能的。 BTW:1Mrow 并不大;该数据量仍将适合缓存,因此“热”数据库中的典型查询几乎不需要磁盘 IO)【参考方案2】:

Look this。想法是生成包含此期间日期的数组或表,并与作业执行表连接。

【讨论】:

以上是关于如何使此查询也返回计数值为 0 的行?的主要内容,如果未能解决你的问题,请参考以下文章

怎么设置access查询中空值为0?

8.聚集函数 ---SQL

Sql 复习

一个返回数值的 mySQL 计数查询?

如何删除或更改postgresql上的cakephp分页计数查询?

2017年7月27~~~