Return Sybase 中基于条件的下一个值
Return next value in Sybase based on condition
我有一个 table 这样的:
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()。
有什么想法可以代替吗?
您不会为此使用 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
来代替——这样会更有效率。
假设:
- 对于任何给定的
date
,每个唯一 ticker
值最多有 1 条记录
next_price
用于第二天,其中 'next' 可以定义为 +1 天、+2 天、+1 周、+1 月等
在我的脑海中...有点复杂的相关子查询来查找next_price
...
设置table和数据:
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 上测试
我有一个 table 这样的:
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()。
有什么想法可以代替吗?
您不会为此使用 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
来代替——这样会更有效率。
假设:
- 对于任何给定的
date
,每个唯一 next_price
用于第二天,其中 'next' 可以定义为 +1 天、+2 天、+1 周、+1 月等
ticker
值最多有 1 条记录
在我的脑海中...有点复杂的相关子查询来查找next_price
...
设置table和数据:
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 上测试