Поскольку вы используете SQL Server 2000, you'er не в состоянии использовать ряд на технику создания последовательности и определить верхнюю строку для каждого уникального идентификатора.
Итак, ваша предлагаемая методика заключается в использовании столбца datetime, чтобы получить верхнюю 1 строку для удаления дубликатов. Это может сработать, но есть вероятность, что вы все равно получите дубликаты с одинаковым значением даты и времени. Но это достаточно легко проверить.
Сначала проверьте предположение о том, что все строки являются уникальными на основе идентификаторов и столбцов дат:
CREATE TABLE #TestTable (rowid INT IDENTITY(1,1), thisid INT, thisdate DATETIME)
INSERT INTO #TestTable (thisid,thisdate) VALUES (1, '11/11/2009')
INSERT INTO #TestTable (thisid,thisdate) VALUES (1, '12/11/2009')
INSERT INTO #TestTable (thisid,thisdate) VALUES (1, '12/12/2009')
INSERT INTO #TestTable (thisid,thisdate) VALUES (2, '1/11/2009')
INSERT INTO #TestTable (thisid,thisdate) VALUES (2, '1/11/2009')
SELECT COUNT(*) AS thiscount
FROM #TestTable
GROUP BY thisid, thisdate
HAVING COUNT(*) > 1
Этот пример возвращает значение 2 - о том, что вы до сих пор в конечном итоге с дубликатами даже после того, как с использованием даты для удаления дубликатов. Если вы вернетесь 0, то вы доказали, что ваш предлагаемый метод будет работать.
При удалении данных о производстве, я думаю, что следует принять некоторые меры предосторожности и проверить до и после. Вы должны создать таблицу для хранения строк, которые вы планируете удалить, чтобы вы могли легко их восстановить, если вам нужно, чтобы после выполнения инструкции удаления.
Кроме того, рекомендуется заранее знать, сколько строк вы планируете удалить, чтобы вы могли проверить счет до и после - и вы можете оценить величину операции удаления. На основании того, сколько строк будет затронуто, вы можете планировать, когда запускать операцию.
Для проверки перед процессом удаления дубликатов найдите вхождения.
-- Get occurrences of duplicates
SELECT COUNT(*) AS thiscount
FROM
#TestTable
GROUP BY thisid
HAVING COUNT(*) > 1
ORDER BY thisid
Это дает вам строки с более чем одной строкой с одинаковым идентификатором. Захватите строки из этого запроса во временную таблицу и затем запустите запрос с помощью СУММ, чтобы получить общее количество строк, которые не уникальны на основе вашего ключа.
Чтобы получить количество строк, которые вы планируете удалить, вам потребуется количество строк, дублирующихся на основе вашего уникального ключа, и количество отдельных строк на основе вашего уникального ключа. Вычитайте отдельные строки из числа вхождений. Все это довольно просто, поэтому я оставлю вас.
Вы сказали удалить дубликаты, но, видимо, вы удаляете все даты между min и max - можете ли вы уточнить? – Amarghosh