如何在SQL中获取各订单号的最大序列号(不使用游标)
解决方案
先明确下你的输入数据:
Order No seq Sta -------------------- 32100 1 rd 32100 3 rd 23600 1 rd 23600 6 rd
要实现每个Order No取最大seq的记录,且不用游标,这里有两种实用的方法:
方法一:GROUP BY + 子查询关联
这种方法兼容性拉满,几乎所有SQL数据库都支持。思路很简单:先分组找出每个订单的最大seq,再和原表关联,拿到对应最大seq的Sta值(就算同一订单的Sta有不同,也能精准匹配到最大seq对应的那条)。
SELECT t1.[Order No], t1.seq, t1.Sta FROM YourTable t1 INNER JOIN ( -- 先获取每个Order No的最大seq值 SELECT [Order No], MAX(seq) AS max_seq FROM YourTable GROUP BY [Order No] ) t2 ON t1.[Order No] = t2.[Order No] AND t1.seq = t2.max_seq;
方法二:窗口函数ROW_NUMBER()
如果你的数据库支持窗口函数(比如SQL Server 2008+、MySQL 8.0+、PostgreSQL、Oracle等),这种写法更简洁直观。我们给每个订单的记录按seq降序排名,取排名为1的那条,就是对应最大seq的记录。
WITH RankedOrders AS ( SELECT [Order No], seq, Sta, -- 按Order No分组,seq降序排序,第一条就是最大seq的记录 ROW_NUMBER() OVER(PARTITION BY [Order No] ORDER BY seq DESC) AS rn FROM YourTable ) SELECT [Order No], seq, Sta FROM RankedOrders WHERE rn = 1;
两种方法都完全避开了游标,效率比游标高得多——尤其是数据量大的时候优势更明显。老版本数据库选方法一稳,新版本数据库用方法二更优雅。
内容的提问来源于stack exchange,提问作者Gowdham
相关产品推荐
相关产品推荐

