如何用单条SQL语句获取最新记录的10个唯一Status值?
获取最近10个不同Status的单条SQL解决方案
你最初的SQL报错是因为SQL Server的规则:使用SELECT DISTINCT时,ORDER BY子句中的列必须出现在选择列表中。但你不需要返回OrderId,所以得换一种思路实现需求——直接获取最近出现的10个不同Status值,可以用以下两种单条SQL完成:
方法一:GROUP BY + MAX(OrderId)(最简洁)
利用GROUP BY对Status去重,同时通过MAX(OrderId)获取每个Status对应的最新订单ID(假设OrderId是自增的,数值越大订单越新),最后按这个最新ID倒序取前10个:
SELECT TOP 10 [Status] FROM [Orders] GROUP BY [Status] ORDER BY MAX([OrderId]) DESC;
方法二:窗口函数分组去重
用ROW_NUMBER()窗口函数按Status分组,每个组内按OrderId降序排序,只保留每个组的第一条(即该Status的最新记录),再按最新订单ID倒序取前10:
SELECT TOP 10 [Status] FROM ( SELECT [Status], ROW_NUMBER() OVER (PARTITION BY [Status] ORDER BY [OrderId] DESC) AS rn FROM [Orders] ) AS temp WHERE rn = 1 ORDER BY (SELECT MAX(OrderId) FROM [Orders] o WHERE o.Status = temp.Status) DESC;
这两种方法都不需要像之前那样调整TOP值试错,能直接准确得到你需要的10个不同Status结果。
内容的提问来源于stack exchange,提问作者Christoph
相关产品推荐
相关产品推荐

