3 Stimmen

Benötige Hilfe bei komplexer Sortierung in SQL

Ich habe ein komplexes Sortierproblem mit meiner SQL-Anweisung. Ich habe eine Tabelle mit den folgenden Spalten.

No   Time    Value  
--   ----    -----
 1   0900    ''
 2   1030    ''
 3   1020    ''
 4   1010    ''
 5   1100    ''
 1   1015    'P'
 2   1045    'P'

Ich möchte diese Tabelle sortieren, indem ich die folgenden Schritte durchführe.

  1. Wählen Sie Zeilen aus der Tabelle aus, deren Wert '' (leere Zeichenfolge) ist, und sortieren Sie sie nach Nr.

  2. Wählen Sie Zeilen aus derselben Tabelle aus, deren Wert "P" ist, und sortieren Sie sie dann nach Zeit.

  3. Wählen Sie jede Zeile aus 2) aus und fügen Sie sie nach Zeit in 1) ein.

Das Ergebnis sollte in etwa so aussehen.

No   Time    Value  
--   ----    -----
 1   0900    ''
 1   1015    'P'
 2   1030    ''
 3   1020    ''
 4   1010    ''
 2   1045    'P'
 5   1100    ''

Wie kann ich dies in SQL tun?

2voto

Andomar Punkte 224164

Edit: Danke für die Kommentare.

Wenn ich noch einmal nachlese, glaube ich nicht, dass Teil 3 Ihrer Frage einen Sinn ergibt. Das Ergebnis aus Schritt 1) ist nicht nach Zeit sortiert, und Sie können es nicht nach Zeit einfügen.

In Ihrem Beispielergebnis hat die zweite Zeile die Zeit 1015, also zwischen 0900 und 1030. Sie könnte aber auch zwischen den Zeilen 1020 und 1010 liegen?

0voto

KLE Punkte 22895

Es scheint, dass Sie Ihr Bedürfnis in einem einfacheren Bedürfnis ausdrücken können.
Sie sortieren immer nach Zeit, eventuell auch nach Wert und dann nach Nein.

    sort by time, value, no

Damit wird alles nach Zeit sortiert. Bei zwei identischen Zeiten wird die Sortierung nach dem Wert vorgenommen usw.


Sie könnten nach einer eindeutigen Nummer sortieren, die Sie erstellen, um Ihre Kriterien zu kombinieren. Aber das wäre etwas komplexer.

0voto

mwigdahl Punkte 15620

Leider glaube ich nicht, dass dies mit einer Standard-SQL-Abfrage möglich ist, und zwar deshalb, weil Ihr Algorithmus nicht mengenorientiert ist. Ihr Beispieldatensatz veranschaulicht dies: Der erste "P"-Datensatz wird zwischen den Datensätzen 0900 und 1030 angezeigt, wäre aber nach Ihren Kriterien genauso gut zwischen den Datensätzen 1010 und 1045 einzuordnen. Wenn es richtig ist, ihn an der von Ihnen angegebenen Position zu platzieren, müssen Sie Ihre Bedingung so ändern, dass sie in etwa lautet: "Platziere jede Zeile aus Nr. 2 zwischen den ersten beiden Zeilen in Nr. 1, die sie zeitlich einschließen", wobei "erste" durch die Sortierkriterien von Nr. 1 definiert ist.

Das Ergebnis ist, dass diese Art der Einrichtung Sie wahrscheinlich zu einer Cursor-basierten Lösung zwingen wird. Sie könnten in der Lage sein, dies zu vermeiden, wenn Sie einen zusammengesetzten Wert zu identifizieren, um auf, aber basierend auf was Sie oben haben ich nicht sehen, was das sein könnte.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X