2016-07-13 15 views
0

Ich habe eine Tabelle, die die folgenden vier Spalten mit einigen BeispieldatenOracle Sortieren nach - Funktion Basierend

Aisle | Rack | Level | Position 
    1  1  1   1 
    1  2  1   2 
    2  1  1   1 
    2  2  1   1 
    2  3  1   1 
    3  1  1   1 
    3  2  1   1 

I hat will eine einzelne Abfrage schreiben, die Datensätze mit dem folgenden

  • sortieren Zuerst nach Gang (Aufsteigend)
  • Dann von Rack (Aufsteigend für einen Gang und Absteigend für die nächste und so weiter. Dies ist der Teil, den ich nicht scheinen kann, wie Sie sehen t, wenn es kann)
  • dann von Stufe (aufsteigend)
  • dann von Position (aufsteigend)

So die resultierenden geordneten Reihen in Oracle erreicht werden wird wie folgt

Aisle | Rack | Level | Position 
    1  1  1   1 
    1  2  1   2 
    2  3  1   1 
    2  2  1   1 
    2  1  1   1 
    3  1  1   1 
    3  2  1   1 

Ist das in Oracle erreichbar?

Antwort

3

Was Sie tun müssen, ist die Gänge aufzählen, so dass Sie die ungeraden und geraden identifizieren können. Die Funktion dense_rank() tut dies - und es ist in der order by Klausel erlaubt.

So:

order by aisle, 
     (case when mod(dense_rank() over (order by aisle), 2) = 1 
       then rack else - rack 
      end), 
     level, position 

Eigentlich, wenn aisle keine Lücken hat, könnten Sie auch:

order by aisle, 
     (case when mod(aisle, 2) = 1 
       then rack else - rack 
      end), 
     level, position 
+0

Dank. Das sieht vielversprechend aus. Nur eine Einschränkung. Es ist auch möglich, dass nur ungerade (oder gerade) nummerierte Gänge bearbeitet werden. Daher sollten alternative Gänge aufsteigend und absteigend auf dem Rack folgen. Konnte das erreicht werden? – Guddu

+1

Ok. Habe gerade dose_rank studiert und die Antwort passt :-) Vielen Dank Gordon. – Guddu

+0

Ich bekomme einen Fehler "ORA-01722: ungültige Nummer", wenn ich die Abfrage ausführen. Die Spalten sind alle vom Typ VARCHAR2. Was könnte ich tun, damit es funktioniert? Bitte helfen Sie. – Guddu