match_recognize 类似分析函数的功能,可以在⾏间进⾏匹配判断并进⾏计算。在 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表数据划分成逻辑分组,每组包含⼀种股票代号。股权回购协议
.ORDER BY 将每个逻辑分组内的数据按照tstamp排序。
.MEASURES 定义了三个度量:V形开始的时间戳(start_tstamp),V形底部的时间戳(bottom_tstamp),以及V形结束的时间戳
(end_tstamp)。bottom_tstamp 和 end_tstamp 度量使⽤了LAST()函数来确保读取到的值是每个匹配模式中的最后⼀个时间戳的值。
.ONE ROW PER MATCH 的意思是对于每个找到的模式匹配,只会有⼀⾏输出。
.AFTER MATCH SKIP TO LAST UP 的意思是每当你找到⼀个匹配,你就在UP模式变量的最后⼀⾏重新开始你的搜索。⼀个模式变量是⼀个在MATCH_RECOGNIZE中使⽤的变量,在DEFINE⼦句定义。
.PATTERN (STRT DOWN+ UP+) 说的是你在搜索的模式有三个模式变量:STRT, DOWN, 以及 UP。DOWN 和 UP之后的加号(+)意思是它们中的每⼀个都⾄少有⼀⾏被映射。这个模式定义⼀个规则表达式,这是⼀种表现⼒很强的搜索⽅式。
.DEFINE 给了我们当⼀个⾏被映射到你的⾏模式变量STRT, DOWN, 和 UP时应该满⾜的条件。因为没有为STRT指定条件,任何⼀⾏都可以被映射为STRT。为什么⼀个模式变量会没有条件?你可以⽤它来作为测试匹配的起点。DOWN和UP都利⽤了PREV()函数,这使得它们能够把当前⾏的价格和前
⼀⾏的价格进⾏⽐较。当价格⽐前⼀⾏更低时DOWN被匹配,所以它定义了V形的下⾏侧(左腿)。如果价格⽐前⼀⾏更⾼则被映射到UP。
下⾯两个图可以帮助你更好地理解例⼦20-1返回的结果。图20-2显⽰了映射到特定模式变量(在PATTERN⼦句中指定)的⽇期。在模式变量到⽇期的映射可见之后,MEASURES⼦句就⽤该信息来计算度量值。度量值的结果被显⽰在图20-3中。