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