2016-04-27 16 views
0

Angenommen, ich habe diese Tabelle mit dem Namen extableSortierung SQL-Tabelle mit mehreren Spalten

|--A--|--B--|--C--| 
|-----|-----|-----| 
|01:21| 4-1 | no | 
|01:28| 4-2 | yes | 
|05:53| 3-5 | yes | 
|03:34| 9-1 | yes | 
|18:48| 9-1 | yes | 
|13:01| 9-1 | yes | 
|00:17| 7-4 | yes | 
|14:24| 4-1 | no | 
|18:19| 4-1 | yes | 
|08:02| 7-4 | yes | 
|15:21| 7-4 | no | 
|21:23| 3-5 | no | 
|02:57| 4-2 | no | 
|21:03| 4-2 | yes | 
|11:31| 4-1 | no | 

Wie ich es von Zeit, Spalte A sortiert werden würde, dann Spalte B, dann Spalte C, wie folgt aus:

|--A--|--B--|--C--| 
|-----|-----|-----| 
|05:53| 3-5 | yes | 
|21:23| 3-5 | no | 
|18:19| 4-1 | yes | 
|14:24| 4-1 | no | 
|21:03| 4-2 | yes | 
|02:57| 4-2 | no | 
|08:02| 7-4 | yes | 
|15:21| 7-4 | no | 
|18:48| 9-1 | yes | 
|21:56| 9-1 | no | 

Ich möchte in der Lage sein, es durch die niedrigsten in Spalte B zu sortieren. Dann möchte ich vor der no Option für jeden Eintrag in Spalte B. Der Zeitstempel in Spalte A wird der neueste der yes sein und no Einträge. Ich fühle mich wie erklärt, dass es viel weniger effektiv ist als das obige Beispiel.

Ich weiß, ich kann dies tun: ORDER BY column B, column C, column A;, aber dies wird jeden einzelnen Eintrag aus der ursprünglichen Tabelle ziehen. Ich will nur die neuesten durch den Zeitstempel in Spalte A, wenn das Sinn macht. Beachten Sie, wie 9-1 vier Einträge in der ursprünglichen Tabelle hat, aber nur die letzten yes und no Optionen wurden dafür gezogen.

Dank

Antwort

1

Sie haben zwei Anforderung: 1) die Ergebnisse als aufgeführt 2) Bestellen nur Halten Sie die neuesten Ja/Nein-Werte für jede Spalte „B“

Die ORDER BY Klausel ist ziemlich einfach. Die einzige Änderung besteht darin, dass "DESC" hinter dem Feld C in der Klausel steht, so dass zuerst yes angezeigt wird. Die zweite Anforderung kann mithilfe einer Fensterfunktion gelöst werden, um die Zeilen in der Ergebnismenge nach B und C zu gruppieren und dann nach A zu sortieren, wobei die Ergebnisse in jeder Gruppe nummeriert werden. Dann haben wir einfach alles als 1 Platz halten

So etwas wie die folgenden funktionieren sollte:

SELECT A,B,C 
FROM 
    (
     SELECT 
      A, 
      B, 
      C, 
      ROW_NUMBER() OVER (PARTITION BY B, C ORDER BY A DESC) as keeprank 
     FROM <table> 
    ) t1 
WHERE keeprank = 1 
ORDER BY A, B, C DESC 
Verwandte Themen