我有一张这样的表:
date ticker price
01/01/17 APPL 700
01/01/17 SNAP 15
01/02/17 APPL 750
01/02/17 SNAP 13
我想要将该代码的下一个价格作为附加列检索,如下所示:
date ticker price next_price
01/01/17 APPL 700 750
01/01/17 SNAP 15 13
01/02/17 APPL 750 NULL
01/02/17 SNAP 13 NULL
我认为在大多数数据库中,您都可以执行以下操作:
SELECT date, ticker, price, RANK() OVER (PARTITION BY ticker
ORDER BY date ASC) AS RANK
from table_name
然后用排名做一些事来找到next_price。不幸的是,Sybase ASE受到了限制,并且不支持RANK()。
关于使用什么的任何想法?
答案 0 :(得分:0)
假设:
ticker
date
值的最大记录为1
next_price
是第二天,'next'可以定义为+1天,+ 2天,+ 1周,+ 1个月等。脱离我的头脑......有点复杂的相关子查询来查找next_price
......
设置表格和数据:
create table mytab
([date] date
,ticker varchar(10)
,price int
)
go
insert mytab values ('1/1/2017','APPL',700)
insert mytab values ('1/1/2017','SNAP',15)
insert mytab values ('1/2/2017','APPL',750)
insert mytab values ('1/2/2017','SNAP',13)
insert mytab values ('1/5/2017','APPL',800)
insert mytab values ('1/7/2017','SNAP',23)
go
一个可能的疑问:
select t1.[date],
t1.ticker,
t1.price,
(select price
from mytab t2
where t2.ticker = t1.ticker
and t2.[date] = (-- find the 'next' available day for t1.ticker
select min([date])
from mytab t3
where t3.ticker = t1.ticker
and t3.[date] > t1.[date]
)
) as next_price
from mytab t1
order by 1,2
go
date ticker price next_price
---------------- ---------- ----------- -----------
Jan 1 2017 APPL 700 750
Jan 1 2017 SNAP 15 13
Jan 2 2017 APPL 750 800
Jan 2 2017 SNAP 13 23
Jan 5 2017 APPL 800 NULL
Jan 7 2017 SNAP 23 NULL
在ASE 15.7 SP138上测试
答案 1 :(得分:-1)
您不会使用rank()
。您可以使用lead()
。
您可以使用相关子查询:
select t.*,
(select top 1 t2.price
from table_name t2
where t2.ticker = t.ticker and t2.date > t.date
order by t2.date asc
) as next_price
from table_name t;
如果你知道日期是下一个日历日期,那么你可以改用left join
- 这会更有效率。