PostgreSQL: Como retornar linhas em relação a uma linha encontrada (resultados relativos)?
Perdoe meu exemplo se não fizer sentido. Vou tentar uma simplificada para incentivar mais participação.
Considere uma tabela como a seguinte:
dt | mnth | foo
--------------+------------+--------
2012-12-01 | December |
...
2012-08-01 | August |
2012-07-01 | July |
2012-06-01 | June |
2012-05-01 | May |
2012-04-01 | April |
2012-03-01 | March |
...
1997-01-01 | January |
Se você procurar o registro comdt
mais próximo de hoje sem passar por cima, qual seria a melhor maneira de também devolver o3 registros previamente e7 registros depois?
Eu decidi tentar as funções de janelas:
WITH dates AS (
select row_number() over (order by dt desc)
, dt
, dt - now()::date as dt_diff
from foo
)
, closest_date AS (
select * from dates
where dt_diff = ( select max(dt_diff) from dates where dt_diff <= 0 )
)
SELECT *
FROM dates
WHERE row_number - (select row_number from closest_date) >= -3
AND row_number - (select row_number from closest_date) <= 7 ;
Eu sinto que deve haver uma maneira melhor de retornar registros relativos com uma função de janela, mas já faz algum tempo desde que eu olhei para eles.