Подзапрос SQL для поиска дубликатов - PullRequest
0 голосов
/ 11 февраля 2012

этот вопрос связан с моим всего минуту назад. Я ищу дубликаты записей в одной таблице. Я ищу соответствующие поля "Symbol" и "TradeDate". У меня есть уникальное поле идентификатора для таблицы. Моя логика: возвращать записи с полем идентификатора, которое не является минимальным значением идентификатора, с количеством> 1 для этой комбинации символа и даты. Вот что у меня есть ... Сервер 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)

1 Ответ

2 голосов
/ 11 февраля 2012
;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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...