2010-12-12 7 views
1

Angenommen wir folgende Daten haben:Select N Row in Oracle

Key Value Desired Rank 
--- ----- ------------ 
P1 0.6   2  
P1 0.6   2  
P1 0.6   2  
P2 0.8   1 
P2 0.8   1 
P3 0.6   3 
P3 0.6   3 

I Keys geordnet nach Wert DESC Distinct auswählen möchten in einem Raster angezeigt werden, die Paginierung unterstützt.

Ich weiß nicht, wie man den Rang generiert, wie die Werte angezeigt in gewünschten Spalte. Damit ich richtig über die Daten

gesetzt Paginieren kann, wenn ich zu verwenden versucht: DENSE_RANK() OVER (ORDER BY-Wert), war das Ergebnis

Key Value DENSE_RANK() OVER(ORDER BY value) 
--- ----- ------------ 
P1 0.6   2  
P1 0.6   2 
P1 0.6   2  
P2 0.8   1 
P2 0.8   1 
P3 0.6   2  
P3 0.6   2 

Wenn ich versuche, die ersten beiden Tasten „zu wählen Rang zwischen 1 und 2 "Ich bekomme 3 Schlüssel zurück. Und dies ruiniert den erforderlichen Paginierungsmechanismus.

Irgendwelche Ideen?

Dank

+0

"Ich weiß nicht, wie ich den Rang als die Werte in der Spalte Gewünschter Rang generieren kann." Ich auch nicht. Sie sagen, dass Sie wollen, dass sie nach Wert absteigend geordnet sind (was die zweite Menge von Daten bietet). Könnten Sie einige Beispiele geben, in denen jede Taste ("P1", "P2" ...) unterschiedliche Werte hat und was Sie in diesen Situationen erwarten? –

Antwort

1

Wenn Sie die eindeutigen Schlüssel und Werte wollen, warum nicht unterscheidbar verwenden?

select distinct 
    t.Key, 
    t.Value 
from 
    YourTable t 
order by 
    t.value 

Benötigen Sie den Rang?

Wenn Sie das tun, könnten Sie noch

select distinct 
    t.Key, 
    t.Value, 
    dense_rank() over() order by (t.Value, t.Key) as Rank 
from 
    YourTable t 
order by 
    t.value 

Diese whould auch ohne deutliche arbeiten.

+0

Danke, das zweite Beispiel funktionierte für mich – Transient

1

‚Wenn ich versuche, die ersten beiden Tasten‚Rang zwischen 1 und 2‘wählen erhalte ich zurück 3 Schlüssel.‘

Das liegt daran, dass Sie nur mit VALUE bestellen, also haben alle KEYS mit dem gleichen Wert den gleichen Rang. Sie müssen also den KEY in die Bestellklausel aufnehmen. Gefällt mir:

DENSE_RANK() OVER (ORDER BY key ASC, value DESC) 
+0

Danke, ich bekam das gewünschte Ergebnis dadurch: DENSE_RANK() OVER (ORDER BY Wert DESC, Taste ASC), damit die Zeilen geordnet nach Wert angezeigt werden, wenn sie gleich ist, der Schlüssel entscheidet über die Bestellung – Transient