2010-09-05 61 views
14

Estoy tratando de averiguar cómo obtener la posición relativa de un solo elemento en una consulta relativa a todos los elementos devueltos por la consulta.Postgres: ¿Busca la posición de una fila específica dentro de un conjunto de resultados?

Por ejemplo, la forma larga mano de obtener la respuesta sería:

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 

¿Hay una manera sencilla de conseguir required_value sólo a través de una sola consulta Postgres?

Respuesta

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 

alternativo sin la sintaxis WITH:

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

La columna position habrá un valor entero que representa la ubicación del registro donde el valor id es 65, basado en la columna published_date en orden ascendente. Si desea duplicar el valor de la posición cuando hay vínculos, reemplace ROW_NUMBER() con RANK()

+0

Perfecto, gracias. – Steerpike

Cuestiones relacionadas