簡體   English   中英

Postgresql left join date_trunc 使用默認值

[英]Postgresql left join date_trunc with default values

我有 3 個表,我正在查詢這些表以根據不同的條件獲取數據。 我有fromto參數,這些是我用來創建時間范圍的參數,我在這些時間范圍內查找這些表中的數據。

例如,如果我from等於“2020-07-01” to等於“2020-08-01”,我希望按周收到表格的分組行值,如果在某些情況下是幾周沒有記錄我想返回 0,如果某些表有同一周的記錄,我想對它們求和。

目前我有這個:

SELECT d.day, COALESCE(t.total, 0)
FROM  (
  SELECT day::date
  FROM generate_series(timestamp '2020-07-01',
                       timestamp '2020-08-01',
                       interval  '1 week') day
) d
LEFT JOIN (
  SELECT date AS day,
         SUM(total)
  FROM table1
  WHERE id = '1'
  AND date BETWEEN '2020-07-01' AND '2020-08-01'
  GROUP  BY day
) t USING (day)
ORDER BY d.day;

我正在生成一系列按周分組的日期,最重要的是我正在添加一個左連接。 現在出於某種原因,它僅在日期完全匹配時才有效,否則COALESCE(t.total, 0)返回 0,即使在那一周 SUM(total) 不為 0。

與我應用 LEFT JOIN 的方式相同,我在同一查詢中使用其他左連接與其他表,所以我遇到了同樣的問題。

請查看這是否適合您。 每當你發現自己聚集不止一次時,問問自己是否有必要。

與其嘗試在離散的日期進行匹配,不如使用時間范圍。

with limits as (
  select '2020-07-01'::timestamp as dt_start, 
         '2020-08-01'::timestamp as dt_end
), weeks as (
  SELECT x.day::date as day, least(x.day::date + 7, dt_end::date) as day_end
    FROM limits l
         CROSS JOIN LATERAL 
           generate_series(l.dt_start, l.dt_end, interval '1 week') as x(day)
   WHERE x.day::date != least(x.day::date + 7, dt_end::date)
), t1 as (
  select w.day, 
         sum(coalesce(t.total, 0)) as t1total
    from weeks w
         left join table1 t
                on t.id = 1
               and t.date >= w.day 
               and t.date < w.day_end
   group by w.day
), t2 as (
  select w.day, 
         sum(coalesce(t.sum_measure, 0)) as t2total
    from weeks w
         left join table2 t
                on t.something = 'whatever'
               and t.date >= w.day 
               and t.date < w.day_end
   group by w.day
)
select t1.day,
       t1.t1total,
       t2.t2total
  from t1
  join t2 on t2.day = t1.day;

您可以像使用 CTE 一樣繼續添加表格。

我之前使用多個left join的示例很糟糕,因為它由於左連接表之間缺少連接條件而爆破了行。

有一個有趣的極端情況,例如2019-02-012019-03-01 ,它返回一個空間隔作為上周。 我已經更新以過濾掉它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM