2012-02-11 130 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