2016-09-14 54 views
0

我試圖讓行,其中兩列的一個具有爲每個組最高值,如下面的圖片SQL Server組和多列

Table Data

爲最大值你可以看到每個單元有boxid,amnt1和amnt2的多行。

我後面的是查詢運行後,它返回突出顯示的行,表示它將返回單元id,在組行中帶有MAX(amnt1),MAX(amnt2)行的boxid。所以在單位10002的情況下最大amnt1是1.60因此輸出是

10002, 156, 1.60, 

有人可以幫我嗎?我不能夠完成這個工作

感謝

回答

1

這裏是計算每列的最大值,然後一個方法使用該信息來找到整體行:

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相同max1max1真的是最大的。同樣,如果amnt2max2max2確實是最大值,那麼保持該行。

@ZLK給出的解決方案更一般。如果你有更多的列,那麼這種邏輯會變得更復雜(呃,並不那麼困難,但apply看起來會更簡單)。但是對於兩列,在row_number()之前嵌套的apply開始顯得有些複雜。

+0

好吧我真的很感謝您的答案(Gordon和ZLK)我只會在戈登的時間線上找到第一個。 戈登你是否也可以解釋你的回答(非正式的說法),以及如果你能指點我一些很好的資源和我可以更多地瞭解和分割的例子? 再次非常感謝您的回覆 – user1063108

1

在你想比較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,並從這兩個中獲取最大值,然後,與其他答案類似,您使用行號函數對結果集進行排序(按單元劃分)。

+0

注意,如果OP要求關係而不是ROW_NUMBER() – Matt

+0

請注意,您也可以使用DENSE_RANK()或RANK()。感謝您的好評ZLK – user1063108