【问题标题】:How do you select data from PostgreSQL database, but if no data is present for a given day, then return 0?如何从 PostgreSQL 数据库中选择数据,但如果某一天没有数据,则返回 0?
【发布时间】:2023-03-27 06:26:01
【问题描述】:

我有以下疑问:

SELECT created_at::DATE, count (*) 
FROM messages      
WHERE city = 'los angeles'     
GROUP BY created_at::DATE

效果很好。挑战在于,如果给定日期没有消息,那么它不会返回该日期的记录。如果在给定日期和今天之间所有天没有消息,您如何使上述查询返回日期和 0?

在 PostgreSQL 8.3 中工作。

谢谢!

【问题讨论】:

    标签: sql postgresql select date rails-postgresql


    【解决方案1】:

    听起来您需要一个包含您感兴趣的所有日期的表格,因为它可能包含不在您的消息表中的日期。如果您拥有或构建了此表,则与消息表离开联接并确实依靠该表的列 - 它将返回 0 与联接不匹配。

    select d.created_at, count(m.messageId)
    from possibleDates d
    left join messages m
        on d.created_at = m.created_at
    group by d.created_at
    

    【讨论】:

      【解决方案2】:

      典型的方法是有一个单独的日历表,其中包含所有日期,在日期列上左连接到您的表,然后是某种 ifnull(x, 0) 语句 [无论该函数适用于 PostgreSQL] 或当日期上的左连接返回 null 时,case 语句返回 0 或当它不为 null 时返回 1。然后你可以做你的正常分组并使用 SUM(x) 而不是 count()。

      【讨论】:

      • 函数的名称是 COALESCE(a,b,c,...),它返回第一个非 NULL 参数(从左到右)。
      【解决方案3】:

      通常,当您想为系列中的缺失条目填充零时,PostgreSQL 中的答案涉及generate_series 函数。 (在 Stackoverflow 中搜索很多类似的问题和答案。)在您的情况下,请使用以下内容:

      SELECT ts::date AS date, coalesce(count, 0) AS count
      FROM
        (SELECT created_at::date, count(*)
         FROM messages
         WHERE city = 'los angeles'
         GROUP BY created_at::date) AS m
        RIGHT JOIN
        (SELECT *
         FROM generate_series(timestamp '2011-07-01',
                              timestamp 'today',
                              interval '1 day')) AS series(ts)
        ON m.created_at = series.ts
      ORDER BY 1;
      

      【讨论】:

      • +1 但是...generate_series(timestamp, timestamp, interval) 不是在 8.4 中引入的吗? (他使用的是 8.3。)
      • @Denis:确实。好吧,要么升级,要么选择其他答案之一。
      • 实际上,您并不需要时间戳来生成天数:select current_date + s.a as dates from generate_series(0,14,7) as s(a); 这适用于 8.3。
      猜你喜欢
      • 2022-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-19
      • 2023-03-25
      • 2020-03-27
      相关资源
      最近更新 更多