如何在SQL中按Cat1、Cat2和Month获取所有最大Order值的行?
解决按Cat1、Cat2、Month筛选组内最大Order值行的问题
你的代码问题在于SQL执行顺序限制:WHERE子句的执行优先级高于SELECT子句,因此在WHERE中无法直接引用SELECT里定义的窗口函数别名max_ord(此时max_ord还未被计算)。以下是两种可行的解决方案:
方法一:使用子查询
先在子查询中计算每组的最大Order值,再在外层筛选出Order等于该最大值的行:
SELECT ID, Cat1, Cat2, Month, [Order] FROM ( SELECT ID, Cat1, Cat2, Month, [Order], MAX([Order]) OVER (PARTITION BY Cat1, Cat2, Month) AS max_ord FROM table ) AS sub_query WHERE [Order] = max_ord;
方法二:使用RANK()窗口函数
通过排名函数标记组内最大Order的行,再筛选排名为1的记录(支持同组多个最大值的情况):
SELECT ID, Cat1, Cat2, Month, [Order] FROM ( SELECT ID, Cat1, Cat2, Month, [Order], RANK() OVER (PARTITION BY Cat1, Cat2, Month ORDER BY [Order] DESC) AS ord_rank FROM table ) AS sub_query WHERE ord_rank = 1;
说明
- 两种方法都能实现需求:按
Cat1、Cat2、Month分组,返回每组中所有Order值等于该组最大值的行。 - 如果同组内有多个行的Order值相同且都是最大值,两种方法都会保留这些行,不会遗漏。
内容的提问来源于stack exchange,提问作者Ziluu
相关产品推荐
相关产品推荐

