如何在无存储过程下让LEFT JOIN遍历日期并访问子查询Q1.dist_date
解决方案
你的问题出在右侧子查询无法访问左侧表的字段——SQL执行时,JOIN右侧的独立子查询会先于主查询执行,此时Q1的dist_date还未生成,自然无法被引用。要实现每个日期对应从2023-01-01到该日期的累计总和,不用存储过程的话,用窗口函数+左连接就能解决,具体SQL如下:
SELECT Q1.dist_date, COALESCE(Q3.cumulative_count, 0) AS cumulative_count FROM ( SELECT DISTINCT toDate(date_update) AS dist_date FROM prod.point_pg pp ) Q1 LEFT JOIN ( SELECT lockers_date, SUM(lockers_count) OVER (ORDER BY lockers_date) AS cumulative_count FROM ( SELECT toDate(pg.date_update) AS lockers_date, COUNT(pg.id) AS lockers_count FROM prod.point_pg pg WHERE pg.state = 0 AND pg.publish = TRUE AND toDate(pg.date_update) >= '2023-01-01' GROUP BY toDate(pg.date_update) ) Q2 ) Q3 ON Q1.dist_date = Q3.lockers_date ORDER BY Q1.dist_date;
逻辑说明
- Q1(日期集合):提取所有distinct的日期,确保结果中每个日期都能被展示。
- Q2(每日统计):过滤符合状态和发布要求的数据,按日期分组计算当天的
lockers_count,同时提前过滤掉2023-01-01之前的日期,减少无效计算。 - Q3(累计计算):用窗口函数
SUM() OVER (ORDER BY lockers_date)对每日统计结果按日期排序,自动计算从2023-01-01到当前日期的累计总和。 - 左连接+补0:将日期集合和累计结果左连接,用
COALESCE把无统计数据日期的NULL转换为0,保证结果格式统一。
为什么原写法报错
原SQL中,JOIN右侧的Q3是独立子查询,SQL执行顺序是先完成子查询的计算,再执行主查询的JOIN操作。此时Q1的dist_date还未被生成,子查询自然无法引用这个外部字段,因此抛出"Missing columns"错误。
内容的提问来源于stack exchange,提问作者Rostislav Aleev
相关产品推荐
相关产品推荐

