2012-06-04 7 views
9

Wie kann das (Oracle) SQL:Rang Funktion in MySQL mit ORDER BY-Klausel

select a.*, rank() over (partition by a.field1 order by a.field2 desc) field_rank 
from table_a a 
order by a.field1, a.field2 

in MySQL übersetzt werden?

This question scheint ähnlich zu sein, aber es gibt keine Reihenfolge von am Ende der Basisabfrage. Ist es auch wichtig, dass es nach den Feldern der Partition geordnet ist?

+0

i didnot qracle wissen, damit Sie zeigen yo Ihr gewünschtes Ergebnis und Beispieldaten zuerst –

+0

Ich kann eine kleine Erklärung geben, es ist etwas wie Sie haben Spalte A und B und Sie bestellen durch A dann B und Sie geben eine Rangnummer basierend auf B für jedes Mitglied der Gruppen in A. Wenn Ich habe recht. – user1433877

Antwort

16

Nach dem Link gab man es so aussehen sollte:

SELECT a.*, 
( 
      CASE a.field1 
      WHEN @curType 
      THEN @curRow := @curRow + 1 
      ELSE @curRow := 1 AND @curType := a.field1 END 
     ) + 1 AS rank 
FROM  table_a a, 
      (SELECT @curRow := 0, @curType := '') r 
ORDER BY a.field1, a.field2 desc; 

Hier sind zwei Geigen, eine für Oracle und eine für mySql basierend auf dem Beispiel aus dem Link, den Sie haben:

  1. oracle
  2. Mysql
+1

Nifty Lösung für die Partition nach Teil. Aber ich frage mich, ob MySQL jemals im 21. Jahrhundert ankommen wird und die modernen SQL-Funktionen nachholen wird. –

+2

+1 Schön! Danke, es funktioniert! Das Einzige, was ich geändert habe, war, dass ich nach dem Ausdruck nicht "+ 1" geschrieben habe (es begann dann erst ab 2). – user1433877

+0

wenn schade, dass ich nicht mehr als einen geben kann wie ... –