2016-09-20 3 views
1

Ich habe eine Datei mit Tausenden von Datensätzen, die gefiltert werden müssen. Ein Beispiel der Daten wird unten zur Verfügung gestellt. Dies sind Testergebnisse für eine Schule. Die Quelle ist eine flache Datei (csv) Das Ziel wäre, Datensätze zu filtern und nur einen Datensatz am nächsten zu geben 01/15/2016 12:00 für jede ID-Nummer Ist dies möglich, wenn ja, wie würden Sie tun gehen also mit SSIS oder SSDT? Ich bin mir nicht sicher, ob dies mit einer bedingten Aufteilung, einer abgeleiteten Spalte usw. und mit welchen Befehlen geschehen würde, um die nächste Zeile mit dem gewünschten Datum und der gewünschten Zeit zu versehen. Vielen Dank im Voraus !!!Filtern von Zeilen basierend auf dem nächsten Datum

Stichprobe von Daten von CSV-Quelldatei

ID, FNAME, LNAME, DATE, SCORE1, SCORE2, SCORE3 1, JOHN, DOE, 12/11/2015 7:44, 100, 99, 98 1, JOHN, DOE, 12/29/2015 11:45, 99, 100, 96 1, JOHN, DOE, 1/10/2016 11:46, 98, 97, 97 1, JOHN, DOE, 1/20/2016 8:47, 97, 98, 99 1, JOHN, DOE, 3/20/2016 11:48, 96, 96, 100 2, JANE, DOE, 12/12/2015 11:44, 100, 99, 98 2, JANE, DOE, 12/28/2015 11:45, 99, 100, 96 2, JANE, DOE, 1/9/2016 11:46, 98, 97, 97 2, JANE, DOE, 1/23/2016 9:47, 97, 98, 99 2, JANE, DOE, 3/8/2016 8:48, 96, 96, 100 3, CHRIS, DOE, 2/8/2016 8:00, 100, 100, 100

Die gewünschten Ergebnisse, die in eine CSV-Flachdateiziel geschrieben werden würde ID, FNAME, LNAME, DATE, SCORE1, SCORE2, SCORE3 1, JOHN, DOE, 01/10/2016 11:46, 98, 97, 97 2, JANE, DOE, 01/9/2016 11:46, 98, 97, 97 3, CHRIS, DOE, 2/8/2016 8:00, 100, 100, 100

Antwort

3

Ich würde dies tun, indem sie die gesamte zu importieren. csv in eine Zwischenspeichertabelle und dann Ausführen einer gespeicherten Prozedur, die ROW_NUMBER() verwendet, um die gewünschte Zeile für jede ID abzurufen, und kopiert nur diese Zeile in die endgültige Zieltabelle.

Dies hat eine bessere Leistung als der Versuch, dies in einem SSIS-Datenfluss zu handhaben.

Beispiel

SELECT 
    ID, 
    FNAME, 
    LNAME, 
    DATE, 
    SCORE1, 
    SCORE2, 
    SCORE3 
FROM (
    SELECT 
     *, 
     ROW_NUMBER() OVER (PARTITION BY ID ORDER BY DATE DESC) as RN 
    FROM 
     YourStagingTable 
) a 
WHERE 
    a.rn = 1 
+0

ziemlich viel, was ich tun würde - möglicherweise ein OPENQUERY/OPENROWSET verwenden, wenn der SQL Server direkten Zugriff auf die Datei hat, was unwahrscheinlich ist. Aber in den meisten Fällen würde es sich darum handeln, die Datei in eine Tabelle zu sortieren und etwas zu starten, das ungefähr dem entspricht, was Sie oben haben. Wenn Sie sich mit anderen Daten verbinden möchten, würde ich ein OUTER APPLY für diese Abfrage in Erwägung ziehen, um die Ergebnisse trotzdem auf eine Set-basierte Weise zu erhalten. –

+0

Leider muss ich SSIS verwenden, um das gewünschte Ergebnis zu erzielen. Wir arbeiten mit CSV-Quelldateien und nicht mit einer SQL-Datenbank. Es muss die Zeile mit dem Datum ziehen, das einem bestimmten Datum am nächsten liegt. Die Zeilennummer kann nicht verwendet werden, da die Anzahl der Zeilen immer unterschiedlich ist. – Andrew

+0

Sie importieren also CSV-Dateien und verwenden ssis, um die Zeilen in neue CSV-Dateien zu exportieren? Es gibt zu keinem Zeitpunkt im Prozess eine Datenbank? –

Verwandte Themen