2015-01-20 3 views
0

Для нижеприведенного набора данных я хочу удалить строку с более поздней меткой времени.Удалить дубликаты на основе условия

**37C1Z2990E5E0 (TRXID) should be UNIQUE** in the below dataSet 

    JKLAMMSDF123 20141112 20141117 5000.0 P 1.22 RT101018 *2014-11-12 10:10:26* 37C1Z2990E5E0 101018 
    JKLAMMSDF123 20141110 20141114 5000.0 P 1.22 RT161002 *2014-11-12 10:11:33* 37C1Z2990E5E0 161002 

-- More rows 
+0

Вы не можете иметь в одинаковых значений ПК в одной таблице. Является ли этот денормализованный набор данных? –

+0

Вас интересуют только результаты с меткой времени [BETWEEN] (https://msdn.microsoft.com/en-us/library/ms187922.aspx) два других? – ryanyuyu

+0

Я имел в виду, что мы можем использовать TRXID как уникальное значение, и никакие дубликаты не допускаются – SHinny

ответ

1

Попробуйте это:

;WITH DATA AS 
(
    SELECT TRXID, MAX(YourTimestampColumn) AS TS 
    FROM YourTable 
    GROUP BY TRXID 
    HAVING COUNT(*) > 1 
) 
DELETE T 
FROM YourTable AS T 
INNER JOIN DATA AS D 
    ON T.TRXID = D.TRXID 
    AND T.YourTimestampColumn = D.TS; 
+0

Это выбирает все строки, а не только дубликаты ... – SHinny

+0

Вы можете попробовать. – dario

+0

спасибо за удивительное решение. – SHinny

0

Выберите минус столбца временной метки и группу всеми другими столбцами.

SELECT MIN(TIMESTAMP), C1, C2, C3... 
FROM YOUR_TABLE 
GROUP BY C1, C2, C3.. 
0

Я буду делать это с помощью window function плюс CTE.

Для проверки результата после удаления дубликатов используйте это.

;WITH DATA 
    AS (SELECT *, 
       Row_number()OVER(partition BY TRXID ORDER BY YourTimestampColumn) rn 
     FROM YourTable) 
select * 
FROM data 
WHERE rn = 1 

К delete дубликаты используют это.

;WITH DATA 
    AS (SELECT *, 
       Row_number()OVER(partition BY TRXID ORDER BY YourTimestampColumn) rn 
     FROM YourTable) 
DELETE FROM data 
WHERE rn > 1 

Это будет работать, даже если вы больше, чем один дубликат для той же TRXID

Смежные вопросы