Tipps für deduping eine Liste basierend auf Prioritätsspalte
-
06-07-2019 - |
Frage
Ich habe eine Reihe von Zeilen, die doppelte Einträge enthalten, da die Daten aus mehrfachen Quellen stammen. Ich habe auch eine separate Referenztabelle, die die Priorität dieser Datenquellen an.
Hat jemand gute Tipps für die effektivste t-SQL diese Liste dedupliziert?
Im Grunde genommen habe ich:
SELECT a.*, b.priority
FROM tableA as a
JOIN tableB as b
ON b.sourceId = a.sourceId
Ich habe diese in eine temporäre Tabelle wurde platzieren und dann auf eine seltsame Art und Weise zu löschen, die ich annehmen könnte effizienter sein.
DELETE ta
FROM #tmp ta
JOIN #tmp tb
ON ta.duplicateId = tb.duplicateId
WHERE ta.priority < tb.priority
Tabelle A hat die gleichen Spalten für die beiden Quellen, aber die Daten können abweichen - so dass sie unterschiedliche Preise haben können. Die Herausforderung besteht darin, dass ich den Preis nehmen muss (und alle anderen Informationen) aus der Zeile, die mit der höchsten Priorität aus der Quelle kommt. Erschwerend kommt hinzu, habe ich nicht die Daten für jedes Element von ALLEN Quellen.
So, Punkt 1 kann Daten von der Quelle A und B, während Punkt 2 nur mich von der Quelle B hat und C. Somit muss die Löschung auf einer Pro-Unikat Basis geschehen.
Lösung
Ich glaube, Sie so etwas tun könnte:
SELECT a.*, b.priority
FROM tableA as a
JOIN tableB as b
ON b.sourceId = a.sourceId and b.priority = (select max(priority) from tableB where b.sourceId = a.sourceId)
Ich kann mich nicht erinnern, wenn Tsql ein in Rahmen für die Unterabfrage haben wird oder nicht though.
Andere Tipps
Versuchen ROW_NUMBER die, die Sie behalten möchten, zu finden, und dann der Rest loszuwerden.
... und erinnere dich an die vorherige Anweisung mit einem Semikolon enden ...
with t as (
SELECT a.*, row_number() over (partition by a.sourceid order by b.priority desc) as priorityorder
FROM tableA as a
JOIN tableB as b
ON b.sourceId = a.sourceId
)
--select * from t
delete t
where priorityorder > 1;
Rob