如果我有這樣的一個表: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.
如果我有這樣的一個表: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.
聲明:我在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
這不起作用,因爲不需要具有來自1,2的id的記錄----等等總是有狀態,以從a到z的名稱以遞增順序開始。而不是應用最大名稱它應該被應用在ID列 –
@DeepakSharma對不起,這個問題沒有說清楚。 –
「例如,Ids 1,3,4具有stateid 1。因此,選擇具有最大Id的行,即4」。這表明作者想要獲得最大編號爲 –
; 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
@Kingfisher,你試過這個嗎? – Esty
的使用子查詢,以找到最大ID爲每個狀態下。 WHERE
子句然後僅包含來自該子查詢的id的行。
SELECT
[Id], [StateID], [Name]
FROM
TABLENAME S1
WHERE
Id IN (SELECT MAX(Id) FROM TABLENAME S2 WHERE S2.StateID = S1.StateID)
您可以使用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
有幾種方法可以做到這一點,取決於DBMS。你正在使用哪些(oracle,mysql,MSSQL等)? – JohnHC
SQL Server 2012 – Ashin