CSDN乘风破浪的 SQL( 三 )


  • MEASURES定义了三个输出值 , 分别代表 V 型曲线的起始日期、最低点日期以及结束日期;其中的 STRT、DOWN 和 UP 都是 DEFINE 选项中定义的变量;LAST(DOWN.tradedate) 表示下降曲线中的最后一个日期 , 也就是最低点日期;LAST(UP.tradedate) 表示上升曲线中的最后一个日期 , 也就是结束日期;
  • ONE ROW PER MATCH表示每次匹配只输出一个汇总结果;每个 V 型曲线输出一条记录;如果使用 ALL ROWS PER MATCH 选项 , 每个 V 型曲线都会输出构成曲线的所有节点 , 下文给出了相应的示例;
  • AFTER MATCH SKIP TO LAST UP表示找到匹配的数据后 , 从当前 V 型曲线的最后一个上升点(UP)重新开始下一次查找;
  • PATTERN (STRT DOWN+ UP+)定义了需要查找的模式 , 使用正则表达式语法表示 。 从起点(STRT)开始 , 先下降一次或多次(DOWN+) , 再上升一次或多次(UP+) , 也就是 V 型曲线;
  • DEFINE用于定义模式变量需要满足的条件 。 STRT 变量没有指定任何条件 , 意味着所有行都可以作为 V 型曲线的开始;DOWN 变量要求它的价格比上一行的价格更小 , PREV 函数表示上一行;UP 变量要求它的价格比上一行的价格更大 。
  • 该语句返回的结果如下:
    SCODE|START_DATE |BOTTOM_DATE |END_DATE |-----||S001 |2019-01-01 00:00:00|2019-01-05 00:00:00|2019-01-06 00:00:00|S001 2019-01-07 00:00:00|2019-01-08 00:00:00|S001 2019-01-12 00:00:00|2019-01-13 00:00:00|S001 |2019-01-18 00:00:00|2019-01-20 00:00:00|2019-01-21 00:00:00|S001 2019-01-22 00:00:00|2019-01-27 00:00:00|S001 2019-01-28 00:00:00|2019-01-30 00:00:00|查询返回了 6 条记录 , 分别对应了上图中的 6 个 V 型曲线 。 MATCH_RECOGNIZE 支持许多选项 , 尤其是通过 DEFINE 变量定义和 PATTERN 正则表达式模式可以实现各种复杂的趋势分析 。
    SQL 行模式识别(MATCH_RECOGNIZE)能够用于检测数据流中的复杂模式 , 具有处理复杂事件(CEP)的强大功能 。 常见的应用包括侦测异常的安全行为、发现金融交易行为模式、欺诈检测和传感器数据分析等 。
    2019 年 SQL 标准增加了第 15 部分:ISO/IEC 9075-15:2019 多维数组(SQL/MDA) 。
    SQL 与多维数组
    多维数组(Multi-Dimensional Arrays)是各种科学和工程数据的核心基础结构 , 包括一维传感器数据、二维卫星和显微镜扫描图像、三维图像时间序列和地球物理数据、以及四维气候和海洋数据等 。
    大部分的编程语言 , 例如 C/C++、Java、Python、R 等 , 都提供了数组类型和相关操作的支持 。 早在 1999 年 , SQL 就已经对数组提供了一些非常基本的支持;最新的 SQL/MDA 允许存储、访问和处理大规模的多维数组 , 例如 N 通道的卫星图像 。 这意味着 SQL 现在可以解码图像 , 并且通过像素坐标直接访问和处理图像区域 。
    CSDN乘风破浪的 SQL
    本文插图
    其中 , MDA 表示在数据库之外的数组数据 , 支持格式包括 TIFF、netCDF、HDF5、JSON 等;SQL/MDA 表示数据库中存储的数组数据 , 支持的操作包括:
    • 数组数据的摄取和存储;
    • 更新存储的数组数据;
    • 导出数组;
    • 数组和关系数据的集成查询 。
    以 PostgreSQL 为例 , 它允许将字段定义为多维数组类型 , 数组的元素可以是任何内置类型、自定义类型、枚举类型、复合类型等 。 例如:
    CREATE TABLE sal_emp (name text,pay_by_quarter integer,schedule text);INSERT INTO sal_empVALUES ('Bill','{10000, 10000, 10000, 10000}','{{"meeting", "lunch"}, {"training", "presentation"}}');INSERT INTO sal_empVALUES ('Carol',ARRAY[20000, 25000, 25000, 25000],ARRAY[['breakfast', 'consulting'], ['meeting', 'lunch']]);sal_emp 表中包含两个数组字段 , pay_by_quarter 是一个一维数组 , schedule 是一个二维数组 。


    推荐阅读