如果我的例子没有意义,请原谅我。我将尝试使用简化版来鼓励更多参与。
考虑如下表格:
-
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 |
如果您寻找 dt
最接近今天的记录,而没有过去,那么最好的方法是预先返回 3 条记录 和 7 条记录之后?
我决定试试窗口函数:
-
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 ;
我觉得一定有更好的方法来使用窗口函数返回相关记录,但我已经有一段时间没看过它们了。
最佳答案
create table foo (dt date);
insert into 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
from (
(
select dt
from foo
where dt <= current_date
order by dt desc
limit 4
)
union all
(
select dt
from foo
where dt > current_date
order by dt
limit 7
)) s
order by 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)
关于sql - PostgreSQL:如何返回与找到的行相关的行(相对结果)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10906206/