如果找不到值,则使用默认填充行PostgresSQL

时间:2019-07-16 03:49:19

标签: sql postgresql

我想返回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

1 个答案:

答案 0 :(得分:5)

您可以不与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