[英]SQL Server group by and max value for multiple column
如果您要比较amnt1和amnt2中的值,请参见以下示例:
DECLARE @myTable TABLE (unit INT, boxid INT, amnt1 DECIMAL(8, 4), amnt2 DECIMAL(8, 4));
INSERT @myTable VALUES
(10002, 2, 0.042, 1.53), (10002, 27, 1.25, null), (10002, 158, null, null), (10002, 63, 1.75, null)
, (10003, 156, 1.60, null), (10003, 2, 0.042, 1.53), (10003, 9, null, null), (10003, 19, 1.15, null)
, (10004, 9, null, null), (10004, 62, 2.000, 100)
, (10005, 69, 0.1, 6.9), (10005, 70, 0.2, 0.2), (10005, 71, 0.23, 0.69);
SELECT unit, boxid, amnt1, amnt2
FROM (
SELECT unit, boxid, amnt1, amnt2, ROW_NUMBER() OVER (PARTITION BY unit ORDER BY Y DESC) R
FROM @myTable
CROSS APPLY (
SELECT MAX(Y)
FROM (VALUES (amnt1), (amnt2)) X(Y)) Z(Y)) T
WHERE R = 1;
此处的叉号比较amnt1和amnt2并从这两个值中获取最大值,然后类似于其他答案,使用行号函数对结果集进行排序(按单位划分)。
这是一种计算每一列的最大值,然后使用该信息查找整个行的方法:
select t.*
from (select t.*,
max(amnt1) over (partition by unit) as max1,
max(amnt2) over (partition by unit) as max2
from t
) t
where (t.amnt1 = max1 and max1 >= max2) or
(t.amnt2 = max2 and max2 >= max1);
这种工作方式是通过计算每个unit
的两列中的每一列的最大值。 这些最大值在max1
和max2
。
在where
子句接着说:保留此行如果amnt1
相同max1
和 max1
是真正的最大值。 同样,保留该行如果amnt2
是一样的max2
和 max2
是真正的最大值。
@ZLK给出的解决方案更为通用。 如果您有更多的专栏,那么用这种方法进行解释的逻辑会变得更加复杂(嗯,实际上并不那么难,但是apply
看起来会更简单)。 但是对于两列,嵌套在row_number()
之前的apply
看起来有点复杂。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.