【问题标题】:Pad row with default if values not found PostgresSQL如果未找到值,则使用默认值填充行 PostgresQL
【发布时间】:2019-11-24 17:55:23
【问题描述】:

我想返回 user_activity 的最后 7 天,但对于那些空的日子我想添加 0 作为值

假设我有这张桌子

actions |  id   | date
------------------------
67      |  123  | 2019-07-7
90      |  123  | 2019-07-9
100     |  123  | 2019-07-10
50      |  123  | 2019-07-13
30      |  123  | 2019-07-15

这应该是过去 7 天的预期输出

  actions |  id   | date
    ------------------------
    90      |  123  | 2019-07-9
    100     |  123  | 2019-07-10
    0       |  123  | 2019-07-11  <--- padded
    0       |  123  | 2019-07-12  <--- padded
    50      |  123  | 2019-07-13
    0       |  123  | 2019-07-14  <--- padded
    30      |  123  | 2019-07-15

这是我目前的查询,我只能得到最近 7 天 但不确定添加到默认值是否是积极的

SELECT *
FROM user_activity
WHERE action_day > CURRENT_DATE - INTERVAL '7 days' 
ORDER BY uid, action_day

【问题讨论】:

  • id 总是 123 吗?如果不是,应该如何计算?
  • @Jeremy 是单个用户的活动,所以不一定

标签: sql postgresql


【解决方案1】:

您可以通过generate_series 离开加入您的餐桌。首先,您需要有一种方法来使用不同 id 的行。然后可以将该集合与主表正确连接。

WITH days
AS (SELECT id,dt
    FROM (
        SELECT DISTINCT id FROM user_activity
        ) AS ids
  CROSS JOIN generate_series(
        CURRENT_DATE - interval '7 days', 
    CURRENT_DATE,  interval '1 day') AS dt
    )
SELECT  
     coalesce(u.actions,0)
    ,d.id
    ,d.dt
FROM days d LEFT JOIN user_activity u ON u.id = d.id AND u.action_day = d.dt

DEMO

【讨论】:

  • +1。你比我早了1分钟。顺便说一句,您不需要合并 id 或 dt - 您可以直接从几天中获取它们。此外,where 子句是多余的,因为 cte 中只有 7 天。
  • @JonathanWillcock:你说得对,我现在已经修改了。
  • 令人印象深刻!非常感谢!我很感激你们
猜你喜欢
  • 1970-01-01
  • 2013-02-25
  • 2020-05-26
  • 2016-09-01
  • 2015-12-02
  • 2019-04-12
  • 2010-11-22
  • 2019-01-19
  • 1970-01-01
相关资源
最近更新 更多