Frage

Zu Beginn mit: Mein Titel ist scheiße, also hilf mir, einen neuen zu finden?

Ich kann nicht alle SQL hier veröffentlichen (über 30.000 Zeichen dafür), also habe ich es angehalten Pastebin.com

Das Problem:

Ich erhalte eine XML -Datei, aus der ich einige Datensätze kratze, und ich muss einige Daten aus den Datensätzen extrahieren und eine andere Tabelle aus erstellen. Die Aufzeichnungen sind für eine Veranstaltung, die ausgeht, und ich habe Beispieldaten in das Pastebin zum Nachbau aufgenommen. Ohne die Daten zu sehen, ist es schwierig zu erklären. Ich habe alle Daten gegeben, die ich aus meinem Beispielimport habe, das ausreichen sollte, um die App auszubauen, aber ich erhalte keine weiteren Informationen als das, was in den Daten angezeigt wird.

Ich werde Ihnen einen Moment Zeit geben, um die Daten zu werfen, damit dies sinnvoll ist.

Ich muss also Folgendes tun: Für jedes "Aus" -Vereignis muss ich es mit dem nächsten "Event" anpassen, und ich muss am Ende zwei Tische haben, einen Tisch für "historische Ereignisse" und einen Tisch für "aktuelle Ereignisse". Wenn ich jedoch nur "historische Ereignisse" richtig erstellen kann, kann ich herausfinden, wie man "aktuelle Ereignisse" davon bekommt.

Geschäftsregeln:

Wenn zwei oder mehr "Off -Events" vor einem "Ereignis" auf "Event" erfasst werden, halten Sie das älteste "Off" -Event. Wenn zwei oder mehr "Ereignisse" vor einem "Off" -Event gesammelt werden, behalten Sie das neueste "Event". Wenn es ein komplettes Paar gibt, legen Sie es in den historischen Tisch. Wenn es ein "Aus" -Ereignis und kein "On" -Event gibt, stecken Sie es in den aktuellen Tisch (wenn ich also weiterhin aus diesem Tisch einfügen/löschen wollte, ist das auch in Ordnung). Wenn es in der aktuellen Tabelle bereits ein "Aus" -Vereignis gibt, kann ich es nehmen und an den historischen Tisch für ein "On" -Ereigner gelesen werden (dies muss später implementiert werden, aber wenn ich die Paarungen übereinstimmen kann Anfangs kann ich vorerst vorwärts gehen.

Ich denke, das ist so ziemlich es für die Logik. Meine Gedanken sind es, entweder herauszufinden, wie das in SQL geht oder Schieben Sie es in eine in C# geschriebene App und tun Sie es mit einigen temporären Listen in C# und erstellen Sie das, was ich für ... Nächste Logik verwenden muss. Dies mag in C# unendlich einfacher sein, aber ich habe das Gefühl, dass SQL diesen Job genauso leicht machen kann wie C# kann also Hilfe beim DBA -Gurus brauchten.

Die Fragen, die ich bereits nicht funktioniert, Aber dort habe ich mit meinem Start gekommen, bevor ich am Freitag nach Hause ging, und ich habe es seitdem nachdacht und ein Beispielproblem aufgebaut, das ich online posten kann (und das ganze Leben auch, das Sie wissen). Die Daten sind Live -Daten und genau, außer dass die ID anonymisiert und die Textfelder in etwas Einfaches geändert werden.

Hier ist eine Tabelle, die ungefähr zeigt, wie die Daten das Ende und die Art und Weise sehen, wie sie jetzt aussieht. Es gibt die aktuellen Daten (mit einer Spacer -Zeile zwischen jeder ID für Klarheit), die Daten, die sich in der historischen Tabelle befinden (ausgerichtet mit der ID der ursprünglichen Daten zum Verständnis) und der aktuellen Tabelle (erneut ausgerichtet). Ich hoffe, dies kann helfen, die Geschäftsregeln zu klären.https://spreadsheets.google.com/ccc?key=0auvcdehuvu5ddHrcnkpuWhburePrajlmlu5VX2XSWNC&hl=en&authkey=coq7y50H

Die vollständige SQL einschließlich TABLEFEFS und aktuelle (sehr nicht rechte) Abfragen finden Sie auf Pastebin http://pastebin.com/k2f2clnq

War es hilfreich?

Lösung 2

Also für fortgesetzte Kommentare und als was wahrscheinlich die Antwort sein wird:

Ich habe es gerade vorgegangen und habe es in C# exportiert und dort verarbeitet. Es ist einfacher, es prozedural zu tun als durch Sets, und ich muss immer noch herausfinden, welche an erster Stelle, aus oder eins (wenn sie gleichzeitig sind). Arbeiten Sie mit ihrem Premierminister zusammen, um es zu wissen, aber ich habe das Gefühl, dass sie nicht wissen, was passiert.

Wie auch immer, so dass die gesamte Diskussion an einem Ort aufbewahrt wird, sehen Sie auch dieses Transkript: (Wenn Sie wirklich interessiert sind) http://chat.stackexchange.com/rooms/179/converation/date-alignment-pair-matching-extraction-best-done-with-tsql-or-c Also gibt es das.

Andere Tipps

Hier ist etwas, mit dem ich basierend auf einigen Arbeiten herumgespielt habe, die ich herumliegen ließ. Es nicht Behandeln Sie die Ereignisse, die zu einem einzigen Mal gut geklustert sind. Es könnte theoretisch sowieso hilfreich sein ... :)

;WITH ordered_rows AS
(
    SELECT ROW_NUMBER() OVER(PARTITION BY Identifier ORDER BY EventTime) AS Row,
        Identifier, Type, EventTime, DiscoveredDate, FileId FROM #EventDataTemp
)
,filtered_rows AS
(
    SELECT Row, Identifier, Type, EventTime, DiscoveredDate, FileId, 
        CAST(CASE Type WHEN 'Went Off' THEN 1 ELSE NULL END AS INT) 
            AS OffEventRow
    FROM ordered_rows
    WHERE Row = 1
    UNION ALL
    SELECT o.Row, o.Identifier, o.Type, o.EventTime, o.DiscoveredDate, o.FileId,
        CAST(CASE WHEN o.Type = 'Went Off' AND f.Type = 'Went Off' 
            OR o.Type = 'Came On' THEN f.OffEventRow ELSE o.Row END AS INT)
    FROM ordered_rows o INNER JOIN filtered_rows f 
        ON o.Row = f.Row + 1 AND o.Identifier = f.Identifier
)
,on_events AS
(
   SELECT Identifier, OffEventRow, MAX(Row) AS OnRow
   FROM filtered_rows
   WHERE Type = 'Came On' AND OffEventRow IS NOT NULL
   GROUP BY OffEventRow, Identifier
)
SELECT f.Identifier, f.Type, f.EventTime, f.DiscoveredDate, f.FileId 
FROM filtered_rows f LEFT JOIN on_events o 
    ON f.Identifier = o.Identifier 
    AND f.Row = o.OnRow
WHERE f.Type = 'Went Off' AND f.Row = f.OffEventRow
OR f.Type = 'Came On' AND o.OnRow IS NOT NULL
ORDER BY f.Identifier, f.EventTime
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit dba.stackexchange
scroll top