Reihenfolge nach mehreren Spalten

8

Ich muss die Daten nach zwei Spalten sortieren, wie mache ich das?

Das ist meine Tabelle:

%Vor%

Ich muss diese Tabelle nach ImpTime und ImpName sortieren und es sollte so aussehen:

%Vor%

Ich verwende diese Abfrage, aber sie sortiert die Tabelle nicht nach Name, sondern nur nach Namen, wenn die Zeit für mehrere Zeilen denselben Wert hat.

%Vor%

Diese Abfrage gibt mir eine Tabelle wie folgt:

%Vor%

Gibt es eine Möglichkeit, diese beiden Spalten gleichzeitig zu sortieren?

BEARBEITEN Was passiert, wenn ich order by ImpFile DESC, ImpTime desc verwende? Es gibt mir eine Ergebnistabelle wie folgt:

%Vor%     
Brezhnews 16.05.2012, 09:07
quelle

6 Antworten

5

Erhalte den Leiter jeder Gruppe und sortiere sie nach absteigender Zeit:

%Vor%

Ausgabe:

%Vor%

Dann schließe dich den Anhängern des Anführers an und erhalte die Zeit des Anführers (TimeGroup):

%Vor%

Ausgabe:

%Vor%

Die Logik der Abfrage besteht darin, dass wir die Zeit der Follower (die mit dem Namen) an die Zeit ihres Führers (TimeGroup) auf der Grundlage von ImpFile angleichen. Der Leiter und seine Anhänger haben dieselbe Zeitgruppe, und wenn wir sie nach der Zeit sortieren, bleiben sie zusammen; dann sortieren wir nach dem Namen

Live-Test: Ссылка

Wenn wir möchten, dass der Gruppenleiter hinter seinen Followern erscheint, geben Sie einen Fall ein, wenn Sie ORDER BY:

verwenden %Vor%

Ausgabe:

%Vor%

Live-Test: Ссылка

Wie es funktioniert:

%Vor%

Ausgabe:

%Vor%

Live-Test: Ссылка

    
Michael Buen 16.05.2012, 13:48
quelle
6

Warum können Sie es einfach so machen:

%Vor%

Nein, es ergibt nicht, was Sie zeigen. Daraus ergibt sich:

%Vor%

Siehe hier für ein Beispiel

BEARBEITEN

Ich habe einen Vorschlag für dich. Vielleicht in etwa so:

Testdaten

%Vor%

Abfrage

%Vor%     
Arion 16.05.2012 09:16
quelle
2

Zunächst sollten Sie erkennen, dass SQL Server mit der Granularität datetime nicht zwischen 2012-05-16 09:55:37.384 und 2012-05-16 09:55:37.385 unterscheiden kann: beide würden als 2012-05-16 09:55:37.384 gespeichert.

Wenn Sie daran denken, dass Sie die Gruppen nach MAX(ImpTime) DESC und die Detailzeilen nach ImpTime DESC sortieren möchten, könnten Sie Folgendes versuchen:

%Vor%

Wenn auf SQL Fiddle ausgeführt wird, erzeugt dies die folgende Ausgabe für Ihr Beispiel:

%Vor%

Und beachte, dass ich ImpTime vorübergehend als varchar definiert habe, nicht als datetime , nur um eine bessere Demonstration zu erhalten, denn, wie ich schon sagte, würde die Granularität von datetime leicht resultieren verschiedene Werte gespeichert (und entsprechend etwas andere Ausgabe produziert).

    
Andriy M 16.05.2012 11:24
quelle
1

Sie möchten wahrscheinlich die Millisekunden scrubben: Ссылка

%Vor%

Ausgabe:

%Vor%

Methode zum Löschen der Millisekunden, die hier gefunden werden: SQL Server entfernt Millisekunden von datetime

Wenn Sie die ursprüngliche Uhrzeit beibehalten und anzeigen möchten, tun Sie dies einfach: Ссылка

%Vor%

Ich denke, SqlFiddle zeigt nicht die Millisekunden. Bitte versuchen Sie die zweite Abfrage auf Ihrem Sql-Server dort, ich bin derzeit auf anderen Betriebssystemen jetzt, ich kann nicht die tatsächliche Ausgabe der zweiten Abfrage

sehen

Hier ist die Ausgabe der zweiten Abfrage mit der intakten Datetime, getestet auf SSMS:

%Vor%     
Michael Buen 16.05.2012 09:29
quelle
0

Es sieht so aus, als ob order by nur auf die zweite select in Ihrer union -Abfrage angewendet wird.

Versuchen Sie, mit subselect eine temporäre Tabelle zu erstellen, auf die order by angewendet werden soll:

%Vor%     
Dan Cruz 16.05.2012 09:42
quelle
0

Sie können die gewünschte Ausgabe mit der Reihenfolge von ImpFile desc, Name

erhalten %Vor%

Hier ist die Ausgabe

%Vor%     
bvr 16.05.2012 12:33
quelle

Tags und Links