Sql 我想这就是我所需要的。@vol7ron:这个答案是错误的。但是lead()可以工作。我发布了一个答案。很抱歉,我没有及时回复你对这个问题的评论。我想避免这种情况,因为记录不规范。我知道我的例子不好,但我希望找到的是有序结果集中的数字和与记录的相关性。具体地
Sql 我想这就是我所需要的。@vol7ron:这个答案是错误的。但是lead()可以工作。我发布了一个答案。很抱歉,我没有及时回复你对这个问题的评论。我想避免这种情况,因为记录不规范。我知道我的例子不好,但我希望找到的是有序结果集中的数字和与记录的相关性。具体地,sql,postgresql,Sql,Postgresql,我想这就是我所需要的。@vol7ron:这个答案是错误的。但是lead()可以工作。我发布了一个答案。很抱歉,我没有及时回复你对这个问题的评论。我想避免这种情况,因为记录不规范。我知道我的例子不好,但我希望找到的是有序结果集中的数字和与记录的相关性。具体地说,我认为这就是我所需要的。@vol7ron:这个答案是错误的。但是lead()可以工作。我给出了一个答案。我切换到MySQL的可能性很小,但我相信它将来可能会有窗口功能——至少,如果Oracle不购买它,它可能会有。因此,我更可能转向Orac
我想这就是我所需要的。@vol7ron:这个答案是错误的。但是
lead()
可以工作。我发布了一个答案。很抱歉,我没有及时回复你对这个问题的评论。我想避免这种情况,因为记录不规范。我知道我的例子不好,但我希望找到的是有序结果集中的数字和与记录的相关性。具体地说,我认为这就是我所需要的。@vol7ron:这个答案是错误的。但是lead()
可以工作。我给出了一个答案。我切换到MySQL的可能性很小,但我相信它将来可能会有窗口功能——至少,如果Oracle不购买它,它可能会有。因此,我更可能转向Oracle、SQL Server或DB2。SQL Server在其SQL中已经是一场噩梦,但DB2的限制类似于仅获取前n行
,这与前n行
或限制n
有很大不同lead
不起作用,因为它不包括未来日期(它需要当前日期的两侧)。另外,WHERE语句可能需要使用dt_lead7
-我认为别名不能在那里使用。@vol7ron:我添加了一个版本来涵盖这个问题,并详细解释了为什么它可以正常工作。我明天必须回顾一下(希望)我切换到MySQL的可能性很小,但我相信它将来可能会有窗口功能——至少,如果Oracle不购买它,它可能会有。因此,我更可能转向Oracle、SQL Server或DB2。SQL Server在其SQL中已经是一场噩梦,但DB2的限制类似于仅获取前n行
,这与前n行
或限制n
有很大不同lead
不起作用,因为它不包括未来日期(它需要当前日期的两侧)。另外,WHERE语句可能需要使用dt_lead7
-我认为别名不能在那里使用。@vol7ron:我添加了一个版本来覆盖这个角落的情况,并详细解释了为什么它可以正常工作。我明天必须回顾这个(希望)
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 |
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 ;
select * from foo
where dt between now()- interval '7 months' and now()+ interval '3 months'
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)
SELECT dt_lead7 AS dt
FROM (
SELECT *, lead(dt, 7) OVER (ORDER BY dt) AS dt_lead7
FROM foo
) d
WHERE dt <= now()::date
ORDER BY dt DESC
LIMIT 11;
SELECT d.dt_lead7 AS dt
FROM (
SELECT *, lead(dt, 7) OVER (ORDER BY dt) AS dt_lead7
FROM (
SELECT '-infinity'::date AS dt FROM generate_series(1,7)
UNION ALL
SELECT dt FROM foo
) x
) d
WHERE d.dt <= now()::date -- same as: WHERE dt <= now()::date1
ORDER BY d.dt_lead7 DESC -- same as: ORDER BY dt DESC 1
LIMIT 11;
WITH x AS (
SELECT *
, row_number() OVER (ORDER BY dt) AS rn
, first_value(dt) OVER (ORDER BY (dt > '2011-11-02')
, dt DESC) AS dt_nearest
FROM foo
)
, y AS (
SELECT rn AS rn_nearest
FROM x
WHERE dt = dt_nearest
)
SELECT dt
FROM x, y
WHERE rn BETWEEN rn_nearest - 3 AND rn_nearest + 7
ORDER BY dt;