簡體   English   中英

SQL Server分組依據和多列的最大值

[英]SQL Server group by and max value for multiple column

我正在嘗試獲得一行,其中兩列之一對每個組都有一個最大值,例如在下圖中

表數據

如您所見,每個單元都有多個帶有boxid,amnt1和amnt2的行。

我需要的是查詢運行后,它將返回突出顯示的行,這將返回單元ID,並在各組行之間返回具有MAX(amnt1),MAX(amnt2)的行的boxid。 因此,對於單元10002,最大amnt1為1.60,因此輸出為

10002, 156, 1.60,

有人可以幫我嗎? 我無法完成這項工作

謝謝

如果您要比較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的兩列中的每一列的最大值。 這些最大值在max1max2

where子句接着說:保留此行如果amnt1相同max1 max1是真正的最大值。 同樣,保留該行如果amnt2是一樣的max2 max2是真正的最大值。

@ZLK給出的解決方案更為通用。 如果您有更多的專欄,那么用這種方法進行解釋的邏輯會變得更加復雜(嗯,實際上並不那么難,但是apply看起來會更簡單)。 但是對於兩列,嵌套在row_number()之前的apply看起來有點復雜。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM