0

Ich habe eine Tabelle, die absichtlich Duplikate enthält. In diesem Fall sind die Dinge, die dupliziert werden, eine deviceId und die datetime. Manchmal aktualisiert der Kunde seine Daten. Die Tabelle hat drei Spalten: deviceId, datetime und value (es gibt einen inkrementellen Primärschlüssel). Manchmal, wenn der Kunde seine Daten neu bewertet, bemerken sie, dass der Wert falsch ist, aktualisieren ihn dann und senden die Daten zur erneuten Verarbeitung. Als Konsequenz muss ich in der Lage sein, Datensätze zu löschen, die nicht die neuesten Datensätze sind. Ich kann es nicht nach Datum und Uhrzeit tun, da dies in einigen Fällen auch dupliziert wird und ich die Staging-Tabelle nicht abschneiden kann.Löschen Sie alle Datensätze, die nicht die neuesten sind

die Betrogenen löschen ich folgendes haben:

;WITH DupeData AS (
SELECT ROW_NUMBER() OVER(PARTITION BY tblMeterData_Id,fldDateTime, fldValue, [fldBatchId],[fldProcessed] ORDER BY fldDateTime) AS ROW 
FROM [Stage.tblMeterData]) 
DELETE FROM DupeData 
WHERE ROW > 1 

Das Problem dabei ist es eine zufällige Duplikat zu löschen scheint.

Ich möchte die neueste Rekord halten, die in den Staging-Bereich ist und alle anderen löschen, die nicht die letzte Aufzeichnung sind. Ich kann dann die relevante Zeile mit dem neuen Wert aktualisieren, mit den neuesten Daten, wenn ich es von Staging in Prod nehme.

+0

ist jede primäre oder eindeutigen Schlüssel auf dem Tisch ok arbeiten? DELETE FROM DupeData wobei id in (select-ID aus ( SELECT ID, ROW_NUMBER() OVER (PARTITION BY tblMeterData_Id, fldDateTime, fldValue, [fldBatchId], [fldProcessed] ORDER BY fldDateTime) AS ROW FROM [Stufe. tblMeterData]) ) q wo q.row> 1) ' – are

+0

Nur die inkrementelle Id, die ich verwendet, um den Tisch zu senden. –

+0

Ich denke, der Penny ist einfach gefallen! –

Antwort

0

ist jede primäre oder eindeutigen Schlüssel auf dem Tisch? wenn es eindeutige ID - die einfachste Art und Weise unter über die Leistung nicht sicher, aber sollte auf kleine Mengen

DELETE FROM DupeData 
where id in 
(select id from 
(SELECT id, 
    ROW_NUMBER() OVER(PARTITION BY tblMeterData_Id,fldDateTime, fldValue, [fldBatchId],[fldProcessed] ORDER BY fldDateTime) AS ROW 
FROM [Stage.tblMeterData]) 
) q 
where q.row > 1) 
+0

Ich versuche das und keine Datensätze sind betroffen, obwohl ich weiß, dass ich vier Duplikate für jede Geräte-ID habe. Ich habe versucht, damit herumzuhantieren und finde keine Dupes zu löschen. Kühle –

+0

bekam es feine Arbeit –

+0

DELETE FROM [Stage.tblMeterData] \t WHERE ID IN \t ( \t \t SELECT ID FROM \t \t ( \t \t \t SELECT ID, ROW_NUMBER() OVER (PARTITION BY tblMeterData_Id, fldDateTime ORDER BY fldDateTime DESC) AS ROW \t \t \t FROM [Stage.tblMeterData] \t \t) als Q \t \t WHERE qR OW> 1 \t) –

Verwandte Themen