[英]Postgresql left join date_trunc with default values
我有 3 个表,我正在查询这些表以根据不同的条件获取数据。 我有from
和to
参数,这些是我用来创建时间范围的参数,我在这些时间范围内查找这些表中的数据。
例如,如果我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-01
到2019-03-01
,它返回一个空间隔作为上周。 我已经更新以过滤掉它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.