sql >> Database teknologi >  >> RDS >> Oracle

Oracle sql eller pl/sql:Beregn baseret på tidligere rækkeværdier og på datokolonnen

Fra Oracle 12c kan du gøre det ved at bruge MATCH_RECOGNIZE :

SELECT *FROM table_nameMATCH_RECOGNIZE( PARTITION BY stock ORDER BY cdate MEASURES CLASSIFIER() AS pttrn ALLE RÆKKER PR. MATCH MØNSTER (bullish|bearish|andet) DEFINER bullish SOM PREV(åben)> PREV (luk) OG Luk Åben OG luk> PREV(Høj) OG Åben  PREV( Åbn) OG Åbn  

Hvilket, for eksempeldata:

OPRET TABEL tabelnavn (Stock, Cdate, Open, High, Low, Close, Volume ) ASSELECT 'XYZ', DATE '2021-01-01', 40.00, 40.50, 38.50, 38.80, 83057 FROM DUAL UNION ALLSELECT 'XYZ', DATO '2021-01-02', 39.20, 39.20, 37.20, 37.80, 181814 FRA DUAL UNION ALLSELECT 'XYZ', DATO '2021-01-03', 38.500, 38.500, 38.500, 38.500, 7, 38.500, 7. DUAL UNION ALLSELECT 'XYZ', DATO '2021-01-04', 36.00, 36.10, 35.60, 35.70, 93737 FRA DUAL UNION ALLSELECT 'XYZ', DATO '2021-01-05', 35.05, 35.05, 35.05, 35.05, 35.05. 169106 FRA DUAL UNION ALLSELECT 'XYZ', DATO '2021-01-06', 36.50, 38.50, 36.50, 38.00, 123179 FRA DUAL UNION ALLSELECT 'XYZ', DATE '3-7.05'00, 3-7.05-00. 39.40, 282986 FRA DUAL UNION ALLSELECT 'XYZ', DATO '2021-01-08', 39.00, 40.50, 38.50, 40.00, 117437 FRA DUAL UNION ALLSELECT 'DDD' 3.101' 3.101', 3.101' 3.101', 3.101' 3.01' 3. 135.10, 136.60, 16454 FRA DUAL UNION ALLSELECT 'DDD', DATO '2021-01-02', 136.50, 138.50, 136.50, 138.00, 281461 FRA ALLSELEC DUAL UNION T 'DDD', DATO '2021-01-03', 137.50, 139.50, 137.30, 139.40, 77334 FRA DUAL UNION ALLSELECT 'DDD', DATO '2021-01-04', 139.010, 139.010, 139.010, 139.010, 139.010, 139.010. DUAL UNION ALLSELECT 'DDD', DATO '2021-01-05', 139.70, 139.80, 139.30, 139.40, 873009 FRA DUAL UNION ALLSELECT 'DDD', DATO '2021-01-01-06, 39.06, 39.06, 39.06, 72, 39, 72, 39.06, 72. 62522 FRA DUAL UNION ALLSELECT 'DDD', DATO '2021-01-07', 138.00, 138.50, 136.50, 137.00, 114826 FRA DUAL UNION ALLSELECT 'DDD', DATE '1318.06, 01316.01, 2021, 01-31, 01, 2021, 01-31, 01, 2021, 01-31. 135.35, 27317 FRA DUAL; 

Udgange:

Du kan også bruge LAG analytisk funktion (som var tilgængelig før Oracle 12):

VÆLG t.*, TILFÆLDE NÅR LAG(åben) OVER (OPDELING EFTER lager ORDER BY cdate)> LAG(close) OVER (OPDELING EFTER lager ORDER BY cdate) OG Luk> Åbn OG luk> LAG(høj) ) OVER (OPDELING EFTER lager BESTIL EFTER cdate) OG Åben  LAG(åben) ) OVER (OPDELING EFTER aktie ORDER BY cdate) OG Åben  

(Hvilket giver lignende output.)

db<>fiddle her

Opdatering:sporer OP og NED:

Igen, det er hvad MATCH_RECOGNIZE er til:

SELECT *FROM table_nameMATCH_RECOGNIZE( PARTITION BY stock ORDER BY cdate MEASURES CLASSIFIER() AS pttrn ALLE RÆKKER PR. MATCH MØNSTER (^initial_value|bullish|bearish|op|ned|other) DEFINER bullish)> SOM PREV(åben bullish) PREV(close) AND Close> Open AND Close> PREV(High) AND Open PREV(Åbn) OG Åben PREV(close) AND open> PREV(open), down AS close

Men du kan gøre det samme med LAG :

SELECT t.*, CASE WHEN ROW_NUMBER() OVER (OPDELING EFTER lager ORDRE EFTER cdate) =1 SÅ 'INITIAL_VALUE' NÅR LAG(åben) OVER (OPDELING EFTER lager ORDER BY cdate)> LAG(close) OVER (OPDELING EFTER lager BESTIL EFTER cdate) OG luk> Åben og luk> LAG(høj) OVER (OPDELING EFTER lager BESTIL EFTER cdate) OG Åben  LAG(open) OVER (OPDELING EFTER lager ORDER BY cdate) OG Åben  LAG(Luk) OVER (OPDELING EFTER lager BESTIL EFTER cdato) OG Åben> LAG(ÅBEN) OVER (OPDELING EFTER lager ORDER BY cdate) SÅ 'OP' NÅR Luk  

db<>fiddle her




  1. Undtagelse ved indlæsning af JDBC-ODBC-driver

  2. Fastgør tabel i Flash-cachen

  3. Oprettelse af MySQL View ved hjælp af UNION

  4. Søg værdi i alle tabeller i databasen