Sql 如何获取最后一个conscutive<;n>;就像Oracle查询中的记录一样

Sql 如何获取最后一个conscutive<;n>;就像Oracle查询中的记录一样,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我有几个链接表,我正在尝试查找数据集,其中一个子表在一行中有3个(或一些用户设置参数)记录,具有给定的值,排序是按日期(在另一个链接表中) 其他表将它们链接在一起,但我可以将AA链接到CA记录,从而得到一个已连接的结果集 AA 30 2/1/2013 AA 30 1/1/2013 AA 60 12/1/2012 AA 30 11/1/2012 BB 30 1/1/2013 BB 30

我有几个链接表,我正在尝试查找数据集,其中一个子表在一行中有3个(或一些用户设置参数)记录,具有给定的值,排序是按日期(在另一个链接表中)

其他表将它们链接在一起,但我可以将AA链接到CA记录,从而得到一个已连接的结果集

AA       30     2/1/2013
AA       30     1/1/2013
AA       60     12/1/2012
AA       30     11/1/2012
BB       30     1/1/2013
BB       30     2/2/2013
BB       30     12/1/2012
BB       40     11/2/2012
我如何查询,以便如果他们想要最后3个连续“30”记录的记录,我只得到BB,但如果他们想要最后2个连续“30”记录的集合,我两个都得到?当然,对于任何在最近的记录中没有30标志的数据,我从来没有得到过那个数据

我从一个现有的查询开始,该查询连接了十几个左右的表,返回的数据基于最新的30个表,并显示了前一个表。我认为对于这个修改,我需要完全重新组织它,但我在如何处理它上还是一片空白,上面我认为说明了我正在尝试做什么


我不需要使用sql(反正我没有提供足够的数据示例),而是一个sql伪代码,它显示了如何根据在另一个间接链接表中找到的顺序来查找具有给定值的连续记录。或者,就这一点而言,如果它都在一个表中,如何获得它,如上面的结果集。

听起来您需要使用
LAG
和/或
LEAD
分析函数。那么比如说,

LAG( flag ) OVER (PARTITION BY id ORDER BY date_column DESC) prior_flag_value
将基于
date\u列
返回该
id
值的
标志
列的先前值。您也可以回顾多行

LAG( flag, 2 ) OVER (PARTITION BY id ORDER BY date_column DESC) prior_flag_value

将从前面两行中获取值。类似地,您可以使用
LEAD
获取下一行的值。

听起来您需要使用
LAG
和/或
LEAD
分析函数。那么比如说,

LAG( flag ) OVER (PARTITION BY id ORDER BY date_column DESC) prior_flag_value
将基于
date\u列
返回该
id
值的
标志
列的先前值。您也可以回顾多行

LAG( flag, 2 ) OVER (PARTITION BY id ORDER BY date_column DESC) prior_flag_value

将从前面两行中获取值。类似地,您可以使用
LEAD
获取下一行的值。

听起来您是在根据日期查找连续出现在一起的记录数

为此,请执行以下操作:

(1) 为每个col1值使用row_number()枚举月份:
row_number()(按col1分区)
作为seqnum_1

(2) 为每个col1、col2组合使用row_number()枚举月份:
row_number()(按col1、col2分区)
作为seqnum_2

(3) 现在
seqnum_1-seqnum_2
标识连续值组

(4) 对每个记录上的每个组进行计数:
Count(*)over(按col1分区,seqnum_1-seqnum_2)作为groupsize


现在,您可以选择GroupSize包含2个或更多元素的位置。

听起来您是在根据日期查找连续出现在一起的记录数

为此,请执行以下操作:

(1) 为每个col1值使用row_number()枚举月份:
row_number()(按col1分区)
作为seqnum_1

(2) 为每个col1、col2组合使用row_number()枚举月份:
row_number()(按col1、col2分区)
作为seqnum_2

(3) 现在
seqnum_1-seqnum_2
标识连续值组

(4) 对每个记录上的每个组进行计数:
Count(*)over(按col1分区,seqnum_1-seqnum_2)作为groupsize


现在,您可以选择GroupSize包含2个或更多元素的位置。

我认为您的记录不是连续的。你需要以某种方式使它们真正连续。然后,您可以尝试使用窗口功能,如…按日期排序,日期范围在1之前和1之后之间…在每个集合中,它们是按日期排序的。我认为您的记录不是连续的。你需要以某种方式使它们真正连续。然后,您可以尝试使用窗口功能,如…按日期排序\u cons\u日期范围介于前1个和后1个之间…在每个集合中,它们是按日期排序的。