Sql-Server
選擇組合 SELECT DISTINCT 的最新單個欄位?
我在 SQL Server 2019 中有下表。
- 最高
id
的行是最新的行。- 列
obj_id
具有對象的不可變標識符。- 列
obj_name
具有添加行時對象的名稱。我需要的是最新的
object_name
。我嘗試了很多東西,但無濟於事。我的一個想法是執行以下操作
SELECT DISTINCT [obj_name] FROM [Table] ORDER BY [id] DESC
失敗並出現此錯誤:
如果指定了 SELECT DISTINCT,則 ORDER BY 項目必須出現在選擇列表中
什麼是實現我的目標的有效方法?
您可以按 desc id 順序列舉每個 obj_id 的行,然後選擇第一個這樣的行
select obj_name from ( select id, obj_name, obj_id , row_number() over (partition by obj_id order by id desc) as rn from test ) as t where rn = 1;
視窗函式是您解決此類問題的朋友。
ROW_NUMBER()
根據 Lennart 的回答,這是經典的解決方案。通常,當您有多個要獲取其最新值的欄位時,它比我將要提供的答案更高效,因為它只是一個視窗函式呼叫,而不是多個。但是在這種情況下,您只關心一個欄位,因此在性能方面應該沒有太大的不同。此外,如果您希望通過不需要使用子查詢或 CTE 來減少程式碼,並且性能足夠,那麼最好了解
FIRST_VALUE
和LAST_VALUE
視窗函式,可以利用它來解決您的問題,如下所示:SELECT DISTINCT FIRST_VALUE(obj_name) OVER (PARTITION BY obj_id ORDER BY id DESC) AS obj_name FROM [Table] -- Hopefully this isn't your actual table name