您好,登錄后才能下訂單哦!
類似分析函數(shù)的功能,可以在行間進(jìn)行匹配判斷并進(jìn)行計算。在 SQL 中新的模式匹配語句是“match_recognize”。
CREATE TABLE Ticker (SYMBOL VARCHAR2(10), tstamp DATE, price NUMBER);
INSERT INTO Ticker VALUES('ACME', DATE '2011-04-01', 12);
INSERT INTO Ticker VALUES('ACME', DATE '2011-04-02', 17);
INSERT INTO Ticker VALUES('ACME', DATE '2011-04-03', 19);
INSERT INTO Ticker VALUES('ACME', DATE '2011-04-04', 21);
INSERT INTO Ticker VALUES('ACME', DATE '2011-04-05', 25);
INSERT INTO Ticker VALUES('ACME', DATE '2011-04-06', 12);
INSERT INTO Ticker VALUES('ACME', DATE '2011-04-07', 15);
INSERT INTO Ticker VALUES('ACME', DATE '2011-04-08', 20);
INSERT INTO Ticker VALUES('ACME', DATE '2011-04-09', 24);
INSERT INTO Ticker VALUES('ACME', DATE '2011-04-10', 25);
INSERT INTO Ticker VALUES('ACME', DATE '2011-04-11', 19);
INSERT INTO Ticker VALUES('ACME', DATE '2011-04-12', 15);
INSERT INTO Ticker VALUES('ACME', DATE '2011-04-13', 25);
INSERT INTO Ticker VALUES('ACME', DATE '2011-04-14', 25);
INSERT INTO Ticker VALUES('ACME', DATE '2011-04-15', 14);
INSERT INTO Ticker VALUES('ACME', DATE '2011-04-16', 12);
INSERT INTO Ticker VALUES('ACME', DATE '2011-04-17', 14);
INSERT INTO Ticker VALUES('ACME', DATE '2011-04-18', 24);
INSERT INTO Ticker VALUES('ACME', DATE '2011-04-19', 23);
INSERT INTO Ticker VALUES('ACME', DATE '2011-04-20', 22);
SELECT *
FROM Ticker MATCH_RECOGNIZE (
PARTITION BY symbol
ORDER BY tstamp
MEASURES STRT.tstamp AS start_tstamp,
LAST(DOWN.tstamp) AS bottom_tstamp,
LAST(UP.tstamp) AS end_tstamp
ONE ROW PER MATCH
AFTER MATCH SKIP TO LAST UP
PATTERN (STRT DOWN+ UP+)
DEFINE
DOWN AS DOWN.price < PREV(DOWN.price),
UP AS UP.price > PREV(UP.price)
) MR
ORDER BY MR.symbol, MR.start_tstamp;
SYMBOL START_TST BOTTOM_TS END_TSTAM
ACME 05-APR-11 06-APR-11 10-APR-11
ACME 10-APR-11 12-APR-11 13-APR-11
ACME 14-APR-11 16-APR-11 18-APR-11
這個查詢做了什么?下面解釋了 MATCH_RECOGNIZE子句中的每一行:
.PARTITION BY 將Ticker表數(shù)據(jù)劃分成邏輯分組,每組包含一種股票代號。
.ORDER BY 將每個邏輯分組內(nèi)的數(shù)據(jù)按照tstamp排序。
.MEASURES 定義了三個度量:V形開始的時間戳(start_tstamp),V形底部的時間戳(bottom_tstamp),以及V形結(jié)束的時間戳(end_tstamp)。bottom_tstamp 和 end_tstamp 度量使用了LAST()函數(shù)來確保讀取到的值是每個匹配模式中的最后一個時間戳的值。
.ONE ROW PER MATCH 的意思是對于每個找到的模式匹配,只會有一行輸出。
.AFTER MATCH SKIP TO LAST UP 的意思是每當(dāng)你找到一個匹配,你就在UP模式變量的最后一行重新開始你的搜索。一個模式變量是一個在MATCH_RECOGNIZE中使用的變量,在DEFINE子句定義。
.PATTERN (STRT DOWN+ UP+) 說的是你在搜索的模式有三個模式變量:STRT, DOWN, 以及 UP。DOWN 和 UP之后的加號(+)意思是它們中的每一個都至少有一行被映射。這個模式定義一個規(guī)則表達(dá)式,這是一種表現(xiàn)力很強(qiáng)的搜索方式。
.DEFINE 給了我們當(dāng)一個行被映射到你的行模式變量STRT, DOWN, 和 UP時應(yīng)該滿足的條件。因為沒有為STRT指定條件,任何一行都可以被映射為STRT。為什么一個模式變量會沒有條件?你可以用它來作為測試匹配的起點。DOWN和UP都利用了PREV()函數(shù),這使得它們能夠把當(dāng)前行的價格和前一行的價格進(jìn)行比較。當(dāng)價格比前一行更低時DOWN被匹配,所以它定義了V形的下行側(cè)(左腿)。如果價格比前一行更高則被映射到UP。
下面兩個圖可以幫助你更好地理解例子20-1返回的結(jié)果。圖20-2顯示了映射到特定模式變量(在PATTERN子句中指定)的日期。在模式變量到日期的映射可見之后,MEASURES子句就用該信息來計算度量值。度量值的結(jié)果被顯示在圖20-3中。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。