热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Oracle存储过程-热浪数(一系列模式匹配数)

如何解决《Oracle存储过程-热浪数(一系列模式匹配数)》经验,为你挑选了1个好方法。

我需要对Oracle数据集进行后处理才能找到热浪的数量.根据定义,当数据值至少连续两次大于阈值时发生热浪.

例如,给定阈值= 20和序列

23 31 32 17 16 23 16 21 22 18

热浪是2:

{23,31,32} and {21,22}

并且最长的一个长度为3(较大子集的大小)

我的输入数据集由几个序列组成; 示例输入结果集是:

 -----------------------------
|  ID   |    DAY   |   VALUE |
 -----------------------------
|   100 |   1/1/17 |    20   |
|   100 |   2/1/17 |    21   |
|   200 |   1/1/17 |    12   | 
|   200 |   2/1/17 |    24   |
|   ...     ...        ...

换句话说,我每个ID都有一个序列,我需要输出类似的东西:

-----------------------
|  ID   |  #heat waves |
 -----------------------
|   100 |      3       | 
|   200 |      1       |

这是我的存储过程的当前版本:

create or replace PROCEDURE sp (
p_query  IN VARCHAR2,
cursor_  out sys_refcursor
) AS
    processed     processed_data_table := processed_data_table();
    c sys_refcursor;
BEGIN
    OPEN c FOR p_query;
    processed.EXTEND;
    processed(processed.count) := processed_data_obj();
    fetch c INTO processed(processed.count).ID, 
    processed(processed.count).DAY, processed(processed.count).VALUE;
    while c%found
        processed.EXTEND;
        processed(processed.count) := processed_data_obj();
        fetch c INTO processed(processed.count).ID, 
        processed(processed.count).DAY, processed(processed.count).VALUE;

    END loop;
    CLOSE c;
    processed.TRIM;

    // HERE I NEED TO PROCESS processed TABLE AND STORE RESULT IN output 
    TABLE

    OPEN cursor_ FOR
    SELECT *
    FROM   TABLE( output);
END sp; 

有人可以帮我提供解决方案吗?

谢谢



1> Matthew McPe..:

在Oracle 12c中,使用MATCH_RECOGNIZE:

select id, count(*) "# of heatwaves" from series_data
match_recognize ( partition by id
                  order by day
                  one row per match
                  after match skip past last row
                  pattern ( over_threshold{2,} )
                  define 
                    over_threshold as value > 20 )
group by id

更新:还显示每个系列的最长热浪

为了获得每个系列中最长的热浪,我们必须引入一个MEASURES子句MATCH_RECOGNIZE,如下所示:

select id, 
       max(heatwave_length) "longest heatwave", 
       count(distinct heatwave_number) "# of heatwaves" 
from series_data 
match_recognize ( partition by id
                  order by day
                  measures
                    FINAL COUNT(*) as heatwave_length,
                    MATCH_NUMBER() heatwave_number
                  all rows per match
                  after match skip past last row
                  pattern ( over_threshold{2,} )
                  define 
                    over_threshold as value > 20 ) 
group by id 
order by id;

数据的完整示例:

with series_data ( id, day, value ) as 
( SELECT 100, date '2017-01-01', 23 from dual union all
  SELECT 100, date '2017-01-02', 31 from dual union all
  SELECT 100, date '2017-01-03', 32 from dual union all
  SELECT 100, date '2017-01-04', 44 from dual union all
  SELECT 100, date '2017-01-05', 16 from dual union all
  SELECT 100, date '2017-01-06', 23 from dual union all
  SELECT 100, date '2017-01-07', 16 from dual union all
  SELECT 100, date '2017-01-08', 21 from dual union all
  SELECT 100, date '2017-01-09', 22 from dual union all
  SELECT 100, date '2017-01-10', 18 from dual union all
  SELECT 200, date '2017-01-01', 23 from dual union all
  SELECT 200, date '2017-01-02', 31 from dual union all
  SELECT 200, date '2017-01-03', 32 from dual union all
  SELECT 200, date '2017-01-04', 17 from dual union all
  SELECT 200, date '2017-01-05', 16 from dual union all
  SELECT 200, date '2017-01-06', 23 from dual union all
  SELECT 200, date '2017-01-07', 16 from dual union all
  SELECT 200, date '2017-01-08', 21 from dual union all
  SELECT 200, date '2017-01-09', 22 from dual union all
  SELECT 200, date '2017-01-10', 22 from dual union all
  SELECT 200, date '2017-01-11', 6 from dual union all
  SELECT 200, date '2017-01-12', 22 from dual union all
  SELECT 200, date '2017-01-13', 22 from dual )
select id, 
       max(heatwave_length) "longest heatwave", 
       count(distinct heatwave_number) "# of heatwaves" 
from series_data 
match_recognize ( partition by id
                  order by day
                  measures
                    FINAL COUNT(*) as heatwave_length,
                    MATCH_NUMBER() heatwave_number
                  all rows per match
                  after match skip past last row
                  pattern ( over_threshold{2,} )
                  define 
                    over_threshold as value > 20 ) 
group by id 
order by id;

结果:

ID       longest heatwave   # of heatwaves
-----    --------------     --------------
100      4                  2
200      3                  3


推荐阅读
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • STM32 IO口模拟串口通讯
    转自:http:ziye334.blog.163.comblogstatic224306191201452833850647前阵子,调项目时需要用到低波 ... [详细]
author-avatar
LoveCherryz
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有