SQL获取指定organizationID对应最后一行数据的问题求助
解决UNION ALL组合TOP 1查询的问题
你的问题核心是每个子查询的ORDER BY需要被限定在各自的查询范围内,直接拼接会让SQL引擎误解ORDER BY的作用对象。这里有两种可靠的解决方法:
方法一:给每个子查询添加括号
把每个带TOP 1和ORDER BY的子查询用括号包裹,确保每个查询先独立筛选出对应organizationID的最后一行,再通过UNION ALL合并结果:
(SELECT TOP 1 * FROM table1 WHERE organizationID = 79 ORDER BY D_Index DESC) UNION ALL (SELECT TOP 1 * FROM table1 WHERE organizationID = 87 ORDER BY D_Index DESC) UNION ALL (SELECT TOP 1 * FROM table1 WHERE organizationID = 19 ORDER BY D_Index DESC)
这样每个子查询都会先按D_Index降序排序,取最大的那一行,再把三个结果合并,完全符合你的需求。
方法二:使用窗口函数(更高效的扩展方案)
如果后续需要扩展更多organizationID,写多个子查询会很繁琐,用ROW_NUMBER()窗口函数可以一次完成所有分组筛选:
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY organizationID ORDER BY D_Index DESC) AS rn FROM table1 WHERE organizationID IN (79, 87, 19) ) AS subquery WHERE rn = 1;
逻辑说明:
PARTITION BY organizationID:按organizationID将数据分组ORDER BY D_Index DESC:每个组内按D_Index降序排列,让最新的行排在最前面ROW_NUMBER():给每个组内的行编号,第一行(也就是D_Index最大的行)编号为1- 最后筛选
rn = 1,就能得到每个organizationID对应的最后一行数据
为什么你的之前写法会出错?
- 无括号的UNION ALL写法:SQL引擎无法识别每个子查询的
ORDER BY是针对自身的TOP 1,会把ORDER BY当成整个UNION ALL结果的排序指令,导致语法错误或不符合预期的结果。 - ORDER BY放在最后的写法:此时
ORDER BY是对整个合并后的结果集排序,而你开头的TOP 1只作用于第一个子查询,后续的UNION ALL结果会被追加,最后整个语句的ORDER BY再排序后,实际只返回了排序后的第一行(也就是D_Index最大的那一行,恰好是organizationID=19的),而前两个子查询因为没有自己的ORDER BY,取的是默认顺序的第一行,自然不符合需求。
内容的提问来源于stack exchange,提问作者see sharp
相关产品推荐
相关产品推荐

