match_recognize
admin
2023-04-23 14:42:35
0
   类似分析函数的功能,可以在行间进行匹配判断并进行计算。在 SQL 中新的模式匹配语句是“match_recognize”。

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中。

上一篇:改善Defaults

下一篇:会话级序列

相关内容

热门资讯

“台独”顽固分子沈伯洋参选台北... 【环球时报特约记者 陈立非】台湾今年年底举行“九合一”选举,国民党很早就确定由现任台北市市长蒋万安争...
伊拉克和巴基斯坦据称已分别同伊... 总台记者当地时间5月12日获悉,伊拉克和巴基斯坦已分别同伊朗签订协议,以从海湾地区运输石油和液化天然...
京沪高铁“涨价”,调价背后有何... 昨天(11日),京沪高铁发布公告称,决定对京沪高速线、合蚌高速线动车组列车公布票价进行优化调整,时速...
第三方样品A厂家生产支架样品测... 第三方样品A厂家生产支架样品测试实验报告 一、检测范围 本次检测对象为A厂家生产的XX型医用金属...
伊朗德黑兰地区发生4.6级地震 总台记者获悉,当地时间5月12日23时47分左右,伊朗德黑兰地区发生4.6级地震。震中位于德黑兰省和...
被科威特指控“武装渗透”布比延... 新华社科威特城/德黑兰5月12日电(记者尹炣 陈霄)科威特政府12日指认,伊朗伊斯兰革命卫队多名武装...
酒吧办护士制服派对被指低俗,当... 据媒体报道,5月12日国际护士节,浙江衢州有网友发帖称,当地APK·ELITE CLUB酒吧举办所谓...
珠海冠宇获得发明专利授权:“一... 证券之星消息,根据天眼查APP数据显示珠海冠宇(688772)新获得一项发明专利授权,专利名为“一种...
大华申请数据写入方法专利,提高... 国家知识产权局信息显示,浙江大华技术股份有限公司申请一项名为“数据写入方法、电子设备及计算机可读存储...
现在,赖清德更焦虑了 执笔/月半刀&宝刀刀&胡一刀5月13日,美国总统特朗普将开启访华行程。外界高度关注此次会晤中双方将如...