2010-09-05 8 views
14

Ich versuche herauszufinden, wie Sie die relative Position eines einzelnen Elements in einer Abfrage relativ zu allen Elementen erhalten, die von der Abfrage zurückgegeben werden.Postgres: Finden Sie die Position einer bestimmten Zeile in einer Ergebnismenge?

Zum Beispiel ist die lange Hand Art und Weise die Antwort zu bekommen wäre:

single_item = SELECT * FROM table WHERE id=65 
result = SELECT * FROM table WHERE published_date < date_value 
x=1 
foreach(result as item): 
    if(item.id == single_item.id): 
     required_value = x 
    endif 
    x++ 
endforeach 

Gibt es eine einfache Art und Weise required_value nur über eine einzige Abfrage Postgres zu bekommen?

Antwort

26

Verwenden analytic/ranking/windowing functionality - 8.4 documentation link:

WITH summary AS (
    SELECT t.*, 
      ROW_NUMBER() OVER(ORDER BY t.published_date) AS position 
    FROM TABLE t) 
SELECT s.* 
    FROM summary s 
WHERE s.id = 65 

Alternate ohne WITH Syntax:

SELECT s.* 
    FROM (SELECT t.*, 
       ROW_NUMBER() OVER(ORDER BY t.published_date) AS position 
      FROM TABLE t) s 
WHERE s.id = 65 

Die position Spalte wird ein ganzzahliger Wert ist, die den Ort des Datensatzes sein, wo der id Wert 65 ist, basierend auf die published_date Spalte in aufsteigender Reihenfolge. Wenn Sie möchten, dass der Positionswert verdoppelt wird, wenn Verbindungen vorhanden sind, ersetzen Sie ROW_NUMBER() durch RANK()

+0

Perfekt, danke. – Steerpike

Verwandte Themen