2010-09-05 7 views
14

Sto cercando di capire come ottenere la posizione relativa di un singolo elemento in una query relativa a tutti gli articoli restituiti dalla query.Postgres: trova la posizione di una riga specifica all'interno di un gruppo di risultati?

Ad esempio, il modo in cui lunga mano di ottenere la risposta sarebbe:

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 

C'è un modo semplice di ottenere required_value solo attraverso una singola query postgres?

risposta

26

Uso 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 

alternative senza WITH sintassi:

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

La colonna position sarà un valore intero che rappresenta la posizione del record dove il valore id è 65, sulla base di la colonna published_date in ordine crescente. Se si desidera che il valore di posizione da duplicare quando ci sono legami, sostituire ROW_NUMBER() con RANK()

+0

Perfetto, grazie. – Steerpike

Problemi correlati