sql - PostgreSQL: How to return rows with respect to a found row (relative results)? -
forgive example if not make sense. i'm going try simplified 1 encourage more participation.
consider table following:
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 |
if record dt closest today w/o going over, best way return 3 records beforehand , 7 records after?
i decided try windowing functions:
with dates ( select row_number() on (order dt desc) , dt , dt - now()::date dt_diff foo ) , closest_date ( select * dates dt_diff = ( select max(dt_diff) dates dt_diff <= 0 ) ) select * dates row_number - (select row_number closest_date) >= -3 , row_number - (select row_number closest_date) <= 7 ;
i feel there must better way return relative records window function, it's been time since i've looked @ them.
create table foo (dt date); insert foo values ('2012-12-01'), ('2012-08-01'), ('2012-07-01'), ('2012-06-01'), ('2012-05-01'), ('2012-04-01'), ('2012-03-01'), ('2012-02-01'), ('2012-01-01'), ('1997-01-01'), ('2012-09-01'), ('2012-10-01'), ('2012-11-01'), ('2013-01-01') ; select dt ( ( select dt foo dt <= current_date order dt desc limit 4 ) union ( select dt foo dt > current_date order dt limit 7 )) s order dt ; dt ------------ 2012-03-01 2012-04-01 2012-05-01 2012-06-01 2012-07-01 2012-08-01 2012-09-01 2012-10-01 2012-11-01 2012-12-01 2013-01-01 (11 rows)
Comments
Post a Comment