2016-10-03 60 views
1

如果我有這樣的一個表:SQL SELECT TOP如果列是相同

Id StateId Name 
1 1 a 
2 2 b 
3 1 c 
4 1 d 
5 3 e 
6 2 f 

我要選擇象下面這樣:

Id StateId Name 
4 1 d 
5 3 e 
6 2 f 

例如,IDS 1,3,4有STATEID 1.所以選擇最大ID的行,即4.

+2

有幾種方法可以做到這一點,取決於DBMS。你正在使用哪些(oracle,mysql,MSSQL等)? – JohnHC

+0

SQL Server 2012 – Ashin

回答

2

聲明:我在OP指定了一個實際的數據庫之前給出了這個答案,因此避免使用窗口函數。有關可能更合適的答案,請參閱上面的@Tanjim的答覆。

這是一個使用連接的選項,它應該可以在大多數RDBMS中工作。

SELECT t1.* 
FROM yourTable t1 
INNER JOIN 
(
    SELECT StateId, MAX(Id) AS Id 
    FROM yourTable 
    GROUP BY StateId 
) t2 
    ON t1.StateId = t2.StateId AND 
     t1.Id  = t2.Id 
+0

這不起作用,因爲不需要具有來自1,2的id的記錄----等等總是有狀態,以從a到z的名稱以遞增順序開始。而不是應用最大名稱它應該被應用在ID列 –

+0

@DeepakSharma對不起,這個問題沒有說清楚。 –

+0

「例如,Ids 1,3,4具有stateid 1。因此,選擇具有最大Id的行,即4」。這表明作者想要獲得最大編號爲 –

8
; WITH CTE AS 
(
    SELECT *, ROW_NUMBER() OVER(PARTITION BY STATEID ORDER BY ID DESC) AS RN 
)SELECT ID, STATEID, NAME FROM CTE WHERE RN = 1 
+0

@Kingfisher,你試過這個嗎? – Esty

2

的使用子查詢,以找到最大ID爲每個狀態下。 WHERE子句然後僅包含來自該子查詢的id的行。

SELECT 
    [Id], [StateID], [Name] 
FROM 
    TABLENAME S1 
WHERE 
    Id IN (SELECT MAX(Id) FROM TABLENAME S2 WHERE S2.StateID = S1.StateID) 
1

您可以使用ROW_NUMBER()+ TOP 1 WITH TIES:

SELECT TOP 1 WITH TIES 
     Id, 
     StateId, 
     [Name] 
FROM YourTable 
ORDER BY ROW_NUMBER() OVER (PARTITION BY StateId ORDER BY Id DESC) 

輸出:

Id StateId Name 
4 1  d 
6 2  f 
5 3  e