繁体   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