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

基于指定日期Entry_ID最小/最大值计算排放值的SQL求助

SQL语法错误修正:关联双表计算指定日期区间的工厂排放起始/结束值

问题描述

我是自学SQL的新手,正在夯实基础。需要实现以下需求:

  • 获取2024年1月1日及前一日(2023年12月31日)对应的最小/最大Entry_ID
  • 关联ReportInfo与EmissionInfo两张表
  • 计算各工厂的起始与结束排放值

当前编写的SQL语句存在语法错误,附上样本数据、报错信息及期望输出,请求修正语句并实现需求。

样本数据

ReportInfo表

FactoryIDEntry_IDReportDate
F00110012023-12-31
F00110032024-01-01
F00210022023-12-31
F00210042024-01-01

EmissionInfo表

Entry_IDEmissionValue
100112.5
10028.3
100315.2
10049.7

报错信息

关键字 'AS' 附近有语法错误。
无法绑定由多个部分组成的标识符 "min_max.Entry_ID"。

期望输出

FactoryIDStartEmissionEndEmission
F00112.515.2
F0028.39.7

修正方案

基础版本SQL(兼容多数SQL方言)

先通过子查询按工厂分组,获取指定日期区间内的最小、最大Entry_ID,再关联双表匹配排放值:

SELECT 
    r_minmax.FactoryID,
    e_start.EmissionValue AS StartEmission,
    e_end.EmissionValue AS EndEmission
FROM (
    -- 子查询:按工厂分组,获取目标日期的最小/最大Entry_ID
    SELECT 
        FactoryID,
        MIN(Entry_ID) AS MinEntryID,
        MAX(Entry_ID) AS MaxEntryID
    FROM ReportInfo
    WHERE ReportDate IN ('2023-12-31', '2024-01-01')
    GROUP BY FactoryID
) AS r_minmax
-- 关联排放表获取起始值(对应最小Entry_ID)
JOIN EmissionInfo e_start ON r_minmax.MinEntryID = e_start.Entry_ID
-- 关联排放表获取结束值(对应最大Entry_ID)
JOIN EmissionInfo e_end ON r_minmax.MaxEntryID = e_end.Entry_ID;

关键修正点

  1. 子查询分组逻辑:原语句可能因未先分组导致标识符绑定错误,子查询先聚合每个工厂的极值ID,避免关联混乱。
  2. 明确关联关系:分别用MinEntryID、MaxEntryID关联EmissionInfo,精准匹配起始/结束排放值。
  3. 日期筛选优化:用IN条件明确指定目标日期,确保数据范围正确。

窗口函数简化版(适用于MySQL 8.0+、SQL Server 2012+等)

如果你的SQL环境支持窗口函数,可通过标记极值记录实现更简洁的查询:

WITH FactoryEmissions AS (
    SELECT 
        r.FactoryID,
        e.EmissionValue,
        -- 标记每个工厂最早的记录(起始值)
        ROW_NUMBER() OVER (PARTITION BY r.FactoryID ORDER BY r.ReportDate, r.Entry_ID) AS rn_start,
        -- 标记每个工厂最晚的记录(结束值)
        ROW_NUMBER() OVER (PARTITION BY r.FactoryID ORDER BY r.ReportDate DESC, r.Entry_ID DESC) AS rn_end
    FROM ReportInfo r
    JOIN EmissionInfo e ON r.Entry_ID = e.Entry_ID
    WHERE r.ReportDate IN ('2023-12-31', '2024-01-01')
)
SELECT 
    FactoryID,
    MAX(CASE WHEN rn_start = 1 THEN EmissionValue END) AS StartEmission,
    MAX(CASE WHEN rn_end = 1 THEN EmissionValue END) AS EndEmission
FROM FactoryEmissions
GROUP BY FactoryID;

这个版本通过窗口函数给每个工厂的记录排序,再用条件聚合提取极值对应的排放值,逻辑更直观。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 04:30:54