2011-03-07 12 views
14

檢索的假設,如果我輸入的是:如何獲得第一條記錄了每個組從結果使用GROUP BY命令

ID GroupID Qty 
1   1 100 
2   1 200 
3   1 300 
4   2 98 
5   2 198 
6   3 175 
7   3 275 
8   3 375 
9   4 215 

輸出應該是

ID GroupID Qty 
1   1 100 
4   2 98 
6   3 175 
9   4 215 

任何一個可以幫助我如何用SQL Server T-SQL查詢呢?

+0

你能更清楚了嗎?輸入什麼?爲什麼輸出應該是這樣呢?你在輸入表格嗎?也許這只是格式不清楚。 – Ramy 2011-03-07 20:59:32

+0

定義「第一」。首先按照什麼命令?根據您的樣本數據,「Qty」總是通過'id'在組內升序? – 2011-03-07 21:10:19

+0

高質量的問題!您可能提到了您正在使用的SQL Server版本。 – 2014-07-16 10:17:46

回答

29
declare @T table (ID int, GroupID int, Qty int) 
insert into @T values 
(1, 1, 100), 
(2, 1, 200), 
(3, 1, 300), 
(4, 2, 98), 
(5, 2, 198), 
(6, 3, 175), 
(7, 3, 275), 
(8, 3, 375), 
(9, 4, 215) 

;with cte as 
(
    select 
    ID, 
    GroupID, 
    Qty, 
    rank() over(partition by GroupID order by ID) as rn 
    from @T 
) 
select ID, GroupID, Qty 
from cte 
where rn = 1 
+0

完美!不過,在我的情況下,我必須將rank()更改爲ROW_NUMBER()。謝謝btw。 – 2014-03-04 05:27:35

+0

很棒的回答。 [CTE](http://technet.microsoft.com/en-us/library/ms190766(v = sql.105).aspx)在MSSQL 2005中可用。不在MSSQL 2000中。 – 2014-07-16 10:19:23

5

編輯

SELECT 
    MIN(ID) , 
    GroupID, 
    (SELECT TOP 1 Qty FROM @TABLE T2 WHERE T2.ID = MIN(T1.ID)) 
FROM 
    @TABLE T1 
GROUP BY 
    GroupID 

輸入

ID GroupID Qty 
    1 1 100 
    2 1 200 
    3 1 300 
    4 2 98 
    5 2 198 
    6 3 175 
    7 3 275 
    8 3 375 
    9 4 215 

輸出

1 1 100 
4 2 98 
6 3 175 
9 4 215 
0

在我看來,最好的和更靈活的方式是使用ROW_NUMBER()。 下面我爲您的示例測試,只需用你的表名稱替換tmpTable

SELECT a.* FROM tmpTable a INNER JOIN 
(SELECT ROW_NUMBER() over(PARTITION BY GroupID ORDER BY ID, GroupID) AS SEQ, tmpTable.* 
FROM   tmpTable) b 
ON a.ID = b.ID AND a.GroupID = b.GroupID 
WHERE b.SEQ = 1 

瞭解更多關於如何使用ROW_NUMBER:https://docs.microsoft.com/en-us/sql/t-sql/functions/row-number-transact-sql

相關問題