PostgreSQL: Jak zwracać wiersze w odniesieniu do znalezionego wiersza (wyniki względne)?
Wybacz mój przykład, jeśli to nie ma sensu. Spróbuję z uproszczonym, aby zachęcić do większego uczestnictwa.
Rozważmy tabelę w następujący sposób:
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 |
Jeśli szukasz rekordu zdt
najbliżej dzisiaj bez przechodzenia, jaki byłby najlepszy sposób na zwrot3 rekordy wcześniej i7 rekordów po?
Postanowiłem wypróbować funkcje okienkowania:
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 ;
Czuję, że musi istnieć lepszy sposób na zwracanie względnych rekordów z funkcją okna, ale minęło trochę czasu, odkąd na nie spojrzałem.