2012-02-11 220 views
0

這個問題與我的一分鐘前有關。我正在查找一張表中的重複記錄。我正在尋找匹配字段「Symbol」和「TradeDate」。我有一個唯一的ID字段用於表格。我的邏輯是:返回帶有ID字段的記錄,該字段不是具有該符號和日期組合的計數> 1的最小ID值。下面是我得到了什麼?SQL Server不抱怨它,直到我運行它,然後它說我的子查詢返回多個值:如果你的下一個問題是要查詢重複項的SQL子查詢

SELECT Symbol , ID FROM tblDailyPricingAndVol 
    WHERE (SELECT Count(TradeDate) FROM tblDailyPricingAndVol AS T2 
      WHERE T2.Symbol = Symbol AND T2.TradeDate = TradeDate GROUP BY Symbol) > 1 
      AND ID <> (SELECT MIN(ID) FROM tblDailyPricingAndVol AS T3 
       WHERE T3.Symbol = Symbol AND T3.TradeDate = TradeDate 
      GROUP BY Symbol) 

回答

2
;WITH x AS 
(
    SELECT ID, TradeDate, Symbol, 
    rn = ROW_NUMBER() OVER (PARTITION BY TradeDate, Symbol ORDER BY ID) 
    FROM dbo.tblDailyPricingAndVol 
) 
SELECT ID, TradeDate, Symbol, rn 
FROM x WHERE rn > 1 
ORDER BY TradeDate, Symbol; 

「現在我想刪除重複」讓我省了一些麻煩,因爲它是一個簡單的變化:

;WITH x AS 
(
    SELECT ID, rn = ROW_NUMBER() OVER (PARTITION BY TradeDate, Symbol ORDER BY ID) 
    FROM dbo.tblDailyPricingAndVol 
) 
DELETE x WHERE rn > 1; 
+0

謝謝。我根據你的帖子編輯了我的邏輯描述...我想要返回所有但是最小的ID。當我得到這個工作時,我會將其更改爲刪除語句。有沒有辦法做到這一點與簡單的選擇/子查詢? (不熟悉PARTITION)。我想知道如何我的子查詢可以返回多個值,每個都是一個聚合函數。 – StatsViaCsh 2012-02-11 01:34:09

+0

看起來像我搶先了你。 PS在子查詢中,只有「GROUP BY Symbol」。 – 2012-02-11 01:37:27

+0

我剛剛發現...我改爲「GROUP BY Symbol,TradeDate」無濟於事。 – StatsViaCsh 2012-02-11 01:44:45