Sql-Server

只選擇一個副本

  • January 4, 2016

我有一個採購訂單和庫房結賬數據庫,似乎庫房結賬往往會插入重複項(我們每晚從舊系統中獲取這些數據)。從該表中獲取所有行的選擇是什麼,但一次只選擇 1 個重複項?我有大約 10 萬份副本,而我的數據庫人員仍在聖誕節假期:|

這些表確實有唯一的鍵,但除了鍵之外,數據被複製了幾千次。我想避免刪除數據(以防萬一)。伺服器正在執行 MSSQL2012,當我回到辦公桌時,我將使用表結構編輯這篇文章。

如果您希望返回的行是完整的、完整的行而不是任何其他列的聚合,則可以為此使用 CTE。您可以ORDER BY通過任何列將其更改為首選行(分組是您認為應該是唯一的)。

;WITH x AS
(
 SELECT col1, col2, col3, 
   rn = ROW_NUMBER() OVER 
   (
       PARTITION BY unique_columns 
       ORDER BY unique_columns, tie_breaker_if_you_care
   )
 FROM dbo.source_table
)
SELECT col1, col2, col3 FROM x WHERE rn = 1;

Jaco 的使用建議DISTINCT在很多情況下都有效。

如果您需要有關“重複項”之間可能不同的欄位的資訊,那麼您可以將相同的項目分組並在其餘部分上使用聚合:

SELECT field1, field2
    , COUNT(*) AS NumberOfCopies
    , MIN(some_numeric_or_date_field_that_varies) AS minValue
    , MAX(some_numeric_or_date_field_that_varies) AS maxValue
GROUP BY field1, field2

如果您需要有關第一個或最後一個副本的特定資訊,那麼您可以嘗試使用視窗函式 ( particularly ROW_NUMBER()),但這會變得有點複雜。如果您可以在問題中添加有關數據的更多詳細資訊,如果看起來相關,我們可以提供更具體的範例。

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