除了

2016-08-02 24 views
1

我已將Microsoft SQL,看起來像這樣除了

ID  Value1  Value2 
1   8   4 
1   4   2 
1   9   3 
1   3   1 
2   4   9 
2   5   7 
2   6   4 
2   7   5 
2   1   1 

我試圖從包含由分組中第一列以最大值對應的行拉只是數據中的數據分組的數據拉附加數據身份證號。結果應如下

ID  Value1 Value2 
1  9   3 
2  7   5 

以下是我所嘗試的,但一直不成功。它在Value2被刪除時有效。

USE [Database] 
SELECT [ID], 
     MAX([Value1]) as Value1, 
     [Value2] 
FROM [dbo].[Datatable] 
GROUP BY [ID] 
+0

你可以使用一個ROW_NUMBER()函數(分區由ID以便通過VALUE1降序)然後只選擇行號= 1 – ZLK

+0

@ZLK我對SQL很不熟悉,你介意給我看看會是什麼樣子? – User247365

+0

所以像'select id,value1,value2 from(select id,value1,value2,row_number()over(id by ID order by desc)從數據表格中分割出來)t其中rn = 1' – ZLK

回答

1

ROW_NUMBER()窗函數可以用於通過ID對錶進行分區和(以降序由值1,在這種情況下)排名內的數據。

DECLARE @DataTable TABLE (ID INT, Value1 INT, Value2 INT); 
INSERT @DataTable (ID, Value1, Value2) 
VALUES (1, 8, 4) 
    , (1, 4, 2) 
    , (1, 9, 3) 
    , (1, 3, 1) 
    , (2, 4, 9) 
    , (2, 5, 7) 
    , (2, 6, 4) 
    , (2, 7, 5) 
    , (2, 1, 1); 

SELECT ID, Value1, Value2 
FROM (
    SELECT ID, Value1, Value2, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Value1 DESC) RN 
    FROM @DataTable) T 
WHERE RN = 1; 

可替換地,如果有上值1的最大值可能的匹配,使用RANK()(或DENSE_RANK()

+0

我很困惑您的解決方案的哪一部分拉取了由ID分組的Value1的最大值? – User247365

+0

@ User247365最後的WHERE子句做到這一點。 RN是賦予ROW_NUMBER()函數的列別名,您只需要爲每個ID指定第一個。如果你在子查詢中執行select語句('SELECT ID,Value1,Value2,ROW_NUMBER()OVER(PARTITION BY ID ORDER BY Value1 DESC)RN FROM @ DataTable'),你可以看到它在做什麼。編輯:要清楚,這裏不需要使用任何'GROUP BY'語句。 – ZLK

+0

@ User247365如果仍然令人困惑,則在您設置結果後,窗口函數會自行應用。因此,子查詢正在獲取所有數據,然後根據Value1在ID中的排名將每個行應用一個數字...然後,外部查詢僅從排名爲1的行中抽取數據。 – ZLK

1

您是否嘗試搜索value2的最大值?這樣

USE [Database] 
SELECT [ID], 
    MAX([Value1]) as Value1, 
    MAX([Value2]) as Value2 
FROM [dbo].[Datatable] 
GROUP BY [ID] 
+0

我希望得到與與value1的最大值相同的行,它不一定是value2的最大值 – User247365