Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在特定位置比较两个日期之间的日期_Sql_Oracle_Plsql_Oracle12c - Fatal编程技术网

Sql 在特定位置比较两个日期之间的日期

Sql 在特定位置比较两个日期之间的日期,sql,oracle,plsql,oracle12c,Sql,Oracle,Plsql,Oracle12c,考虑到表中的以下示例记录:MY_DATES,使用Oracle SQL和/或PL/SQL,我需要始终获取此表中注册的第一个日期,即2019年10月26日,然后前进到第三个日期,即2020年2月2日,并检查它们之间的差异是否大于13周,即 select to_date('2/02/2020','dd/mm/yyyy') - to_date('26/10/2019','dd/mm/yyyy') a from dual Table Name: MY_DATES NM DATE_REGISTERED

考虑到表中的以下示例记录:MY_DATES,使用Oracle SQL和/或PL/SQL,我需要始终获取此表中注册的第一个日期,即2019年10月26日,然后前进到第三个日期,即2020年2月2日,并检查它们之间的差异是否大于13周,即

select to_date('2/02/2020','dd/mm/yyyy') - to_date('26/10/2019','dd/mm/yyyy') a from dual

Table Name: MY_DATES

NM  DATE_REGISTERED
--- ---------------
A1  26/10/2019
A1  2/11/2019
A1  2/02/2020
A1  9/02/2020
A1  16/02/2020
A1  23/02/2020
A1  1/03/2020
A1  8/03/2020

此练习的最终结果是返回满足此条件的不同NM值数据。

这似乎很奇怪。我在想
lead()
lag)
。如果需要符合条件的
nm
值:

select md.*
from (select md.*,
             lead(date_registered, 2) over (partition by nm order by date_registered) as next_dr_2,
             lag(date_registered) over (partition by nm order by date_registered) as prev_dr
      from my_dates md
     ) md
where prev_dr is null and
      next_dr_2 > date_registered + interval '91' day;

这似乎很奇怪。我在想
lead()
lag)
。如果需要符合条件的
nm
值:

select md.*
from (select md.*,
             lead(date_registered, 2) over (partition by nm order by date_registered) as next_dr_2,
             lag(date_registered) over (partition by nm order by date_registered) as prev_dr
      from my_dates md
     ) md
where prev_dr is null and
      next_dr_2 > date_registered + interval '91' day;

下面是一个使用MATCH_Recognite子句的高效解决方案,该子句在Oracle 12.1版中引入

WITH子句模拟输入数据(它不是解决方案的一部分-删除它并在主查询中引用实际的表名和列名)

解决方案按NM划分,按DT排序,然后查找三个连续的行,其中第三个日期比第一个日期晚13周以上。一旦找到一个这样的匹配项,它就会用分区中所有剩余的行填充“匹配模式”,基本上把它们扔掉——因为我们只关心一个匹配项

注意我添加的两个NM。BB的日期间隔超过13周,但不在连续三天内。CC有两个连续的日期,间隔已经超过13周;CC不在输出中,因为没有三个不同的开始日期。(注意——这就是我对要求的理解;如果需要的是“相隔13周以上的连续日期也应计算在内”,这很容易解决——但这不是海报问题中的措辞。)

**编辑**

重读这个问题,似乎只有前三个日期应该被考虑(而不是任何连续的三个日期)

这使问题变得更简单。而且解决方案可以很容易地修改-唯一需要的更改是
模式
子句,它应该是:

pattern ( ^ a b c )

这将在分区的开头锚定对三行的搜索。其他行未被检查。

这是一个使用MATCH_Recognite子句的有效解决方案,该子句在Oracle 12.1版中引入

WITH子句模拟输入数据(它不是解决方案的一部分-删除它并在主查询中引用实际的表名和列名)

解决方案按NM划分,按DT排序,然后查找三个连续的行,其中第三个日期比第一个日期晚13周以上。一旦找到一个这样的匹配项,它就会用分区中所有剩余的行填充“匹配模式”,基本上把它们扔掉——因为我们只关心一个匹配项

注意我添加的两个NM。BB的日期间隔超过13周,但不在连续三天内。CC有两个连续的日期,间隔已经超过13周;CC不在输出中,因为没有三个不同的开始日期。(注意——这就是我对要求的理解;如果需要的是“相隔13周以上的连续日期也应计算在内”,这很容易解决——但这不是海报问题中的措辞。)

**编辑**

重读这个问题,似乎只有前三个日期应该被考虑(而不是任何连续的三个日期)

这使问题变得更简单。而且解决方案可以很容易地修改-唯一需要的更改是
模式
子句,它应该是:

pattern ( ^ a b c )

这将在分区的开头锚定对三行的搜索。其他行未被检查。

这是正确的-我需要返回满足此标准的不同NM值。太好了-谢谢。现在的问题是,我需要输入所有MY_DATES记录,即nm/date_将REC注册为group by nm和order by date_注册的asc,然后在它们上运行代码。这是正确的-我需要在满足此条件的情况下返回不同的nm值。太好了-谢谢。现在的问题是,我需要输入所有MY_DATES记录,即nm/date_将REC注册为group by nm和order by date_注册的asc,然后在其上运行代码。说明所需的输出将很有帮助。解释逻辑很好,但它本身并不能告诉我们您需要什么结果。另外,NM在这方面扮演什么角色?我假设您正在查看按NM划分的数据,但我在您的问题中看不到这方面的任何内容。@mathguy我已经根据所寻求的最终结果对我的问题进行了UoDATE。在我解决问题时,另一个问题变得很明显。如果NM表中只有两行,并且日期间隔超过13周,该怎么办?它们甚至没有三个日期,因此根据您的描述,它们似乎不应该包含在输入中。这是正确的问题陈述吗?说明所需的输出会很有帮助。解释逻辑很好,但它本身并不能告诉我们您需要什么结果。另外,NM在这方面扮演什么角色?我假设您正在查看按NM划分的数据,但我在您的问题中看不到这方面的任何内容。@mathguy我已经根据所寻求的最终结果对我的问题进行了UoDATE。在我解决问题时,另一个问题变得很明显。如果NM表中只有两行,并且日期间隔超过13周,该怎么办?它们甚至没有三个日期,因此根据您的描述,它们似乎不应该包含在输入中。这是正确的问题陈述吗?没错,我会一直看前三个日期(如果每个NM都有),然后想看看我的答案