2017-11-20 45 views
0

Ich habe eine Tabelle wie folgt aus:nächste Wert in Sybase basiert auf Bedingung

date  ticker  price 
01/01/17 APPL   700 
01/01/17 SNAP   15 
01/02/17 APPL   750 
01/02/17 SNAP   13 

Ich möchte würde den nächsten Preis für diesen Ticker als zusätzliche Spalte abzurufen, etwa so:

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 

ich glaube, in den meisten Datenbanken Sie in der Lage sein würden, so etwas zu tun: mit dem Rang

SELECT date, ticker, price, RANK() OVER (PARTITION BY ticker 
ORDER BY date ASC) AS RANK 
from table_name 

und dann etwas tun, um finde den nächsten Preis. Leider ist Sybase ASE leider limitiert und unterstützt RANK() nicht.

Irgendwelche Ideen, was Sie stattdessen verwenden?

Antwort

0

Annahmen:

  • jeder eindeutige haben ticker Wert ein Maximum von 1 Datensatz für jeden date gegeben
  • next_price für den nächsten Tag ist, wo ‚next‘ könnte als 1 Tag, 2 Tage definiert werden , 1 Woche, 1 Monat, etc

aus der Spitze von meinem Kopf ... ein bisschen von einer gewundenen korrelierte Unterabfrage next_price ...

zu finden

Vortisch und Daten:

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 

Eine mögliche Abfrage:

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 

auf ASE Getestet 15,7 SP138

+0

Das ist einfach zu verstehen und funktionierte perfekt, auch wenn meine Daten etwas detaillierter sind als das, was ich gepostet habe. Ich danke dir sehr! –

-1

Sie würden rank() dafür nicht verwenden. Sie würden lead() verwenden.

Sie können eine korrelierte Unterabfrage verwenden:

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; 

Wenn Sie das Datum ist der nächste Kalendertag kennen, dann können Sie einen left join stattdessen verwenden - das effizienter wäre.

+0

Und warum sollte eine scheinbar richtige Antwort anonym downvoted? –

Verwandte Themen