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 上测试