У меня есть таблица, в которой около 300 000 строк. 225 строк добавляются в эту таблицу ежедневно с 16 марта 2015 г. по 09 июля 2015 г.

Моя проблема в том, что за последнюю неделю или около того в таблицу вводятся повторяющиеся строки (т.е. более 225 в день)

Теперь я хочу выбрать (и, в конечном счете, удалить!) все повторяющиеся строки из таблицы, которые имеют более 1 комбинации siteID + reportID, существующих для одного столбца Date .

Пример прикреплен на скриншоте:

enter image description here

-1
Bounty 13 Июл 2015 в 13:48
2
После того, как вы вытерли пол, не забудьте устранить течь. Если дубликатов не должно существовать, не забудьте добавить в таблицу ограничение UNIQUE после удаления текущих дубликатов.
 – 
Damien_The_Unbeliever
13 Июл 2015 в 13:54
Спасибо, буду иметь в виду .. есть предложения по запросу? :)
 – 
Bounty
13 Июл 2015 в 13:56
 – 
KarmaEDV
13 Июл 2015 в 13:56

2 ответа

Когда Row_Number() используется с предложением Partition By, он может предоставить разработчику SQL возможность выбирать повторяющиеся строки в таблице.

Ознакомьтесь с руководством по SQL на странице как удалить повторяющиеся строки в таблице SQL Ниже приведен запрос, скопированный из этой статьи и примененный к вашему требованию:

;WITH DUPLICATES AS
(
SELECT *,
  RN = ROW_NUMBER() OVER (PARTITION BY siteID, ReportID ORDER BY Date)
FROM myTable
)
DELETE FROM DUPLICATES WHERE RN > 1

Я надеюсь, что это помогает,

0
Eralper 13 Июл 2015 в 15:02
Кажется, что PARTITION должно быть siteID, ReportID, Date, а ORDER - каким-то другим столбцом, например ID.
 – 
Vladimir Baranov
13 Июл 2015 в 15:22
Не согласен :) Насколько я понял из требования, для дублирования записей достаточно, если они имеют одинаковые SiteID и ReportID. С другой стороны, если это так, как вы сказали, то дата должна быть включена в предложение Partition By, а поле Order By определяет оригинал и дубликаты.
 – 
Eralper
13 Июл 2015 в 15:27

Если вы хотите отфильтровать повторяющиеся строки, я предлагаю вам запрос такого типа:

SELECT *
FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY Col1, Col2 ORDER BY Col3) As seq
    FROM yourTable) dt
WHERE (seq > 1)

Как это:

SELECT *
FROM (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY siteID, reportID, [Date] ORDER BY ID) As seq
    FROM yourTable) dt
WHERE (seq > 1)
0
shA.t 14 Июл 2015 в 09:45