根据条件返回Sybase中的下一个值

时间:2017-11-20 20:36:31

标签: sql sybase sybase-ase

我有一张这样的表:

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()。

关于使用什么的任何想法?

2 个答案:

答案 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 - 这会更有效率。