Sql-Server

選擇組合 SELECT DISTINCT 的最新單個欄位?

  • September 1, 2022

我在 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_VALUELAST_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

引用自:https://dba.stackexchange.com/questions/316328