You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在无存储过程下让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;

逻辑说明

  1. Q1(日期集合):提取所有distinct的日期,确保结果中每个日期都能被展示。
  2. Q2(每日统计):过滤符合状态和发布要求的数据,按日期分组计算当天的lockers_count,同时提前过滤掉2023-01-01之前的日期,减少无效计算。
  3. Q3(累计计算):用窗口函数SUM() OVER (ORDER BY lockers_date)对每日统计结果按日期排序,自动计算从2023-01-01到当前日期的累计总和。
  4. 左连接+补0:将日期集合和累计结果左连接,用COALESCE把无统计数据日期的NULL转换为0,保证结果格式统一。

为什么原写法报错

原SQL中,JOIN右侧的Q3是独立子查询,SQL执行顺序是先完成子查询的计算,再执行主查询的JOIN操作。此时Q1的dist_date还未被生成,子查询自然无法引用这个外部字段,因此抛出"Missing columns"错误。

内容的提问来源于stack exchange,提问作者Rostislav Aleev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 16:27:24