基于指定日期Entry_ID最小/最大值计算排放值的SQL求助
SQL语法错误修正:关联双表计算指定日期区间的工厂排放起始/结束值
问题描述
我是自学SQL的新手,正在夯实基础。需要实现以下需求:
- 获取2024年1月1日及前一日(2023年12月31日)对应的最小/最大
Entry_ID - 关联
ReportInfo与EmissionInfo两张表 - 计算各工厂的起始与结束排放值
当前编写的SQL语句存在语法错误,附上样本数据、报错信息及期望输出,请求修正语句并实现需求。
样本数据
ReportInfo表
| FactoryID | Entry_ID | ReportDate |
|---|---|---|
| F001 | 1001 | 2023-12-31 |
| F001 | 1003 | 2024-01-01 |
| F002 | 1002 | 2023-12-31 |
| F002 | 1004 | 2024-01-01 |
EmissionInfo表
| Entry_ID | EmissionValue |
|---|---|
| 1001 | 12.5 |
| 1002 | 8.3 |
| 1003 | 15.2 |
| 1004 | 9.7 |
报错信息
关键字 'AS' 附近有语法错误。
无法绑定由多个部分组成的标识符 "min_max.Entry_ID"。
期望输出
| FactoryID | StartEmission | EndEmission |
|---|---|---|
| F001 | 12.5 | 15.2 |
| F002 | 8.3 | 9.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;
关键修正点
- 子查询分组逻辑:原语句可能因未先分组导致标识符绑定错误,子查询先聚合每个工厂的极值ID,避免关联混乱。
- 明确关联关系:分别用MinEntryID、MaxEntryID关联EmissionInfo,精准匹配起始/结束排放值。
- 日期筛选优化:用
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
相关产品推荐
相关产品推荐

