如何获取Oracle查询中最后连续的<n>类记录</n>

时间:2013-03-06 22:39:17

标签: sql oracle oracle11g

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

Table1
ID     LinkID   Flag
AA1    AA       30
AA2    AA       30
AA3    AA       60
AA4    AA       30
BB1    BB       30
BB2    BB       30
BB3    BB       30
BB4    BB       40

Table2
TA1    CA      2/1/2013
TA2    CA      1/1/2013
TA3    CA      12/1/2012
TA4    CA      11/1/2012
TB1    CB      2/2/2013
TB2    CB      1/1/2013
TB3    CB      12/1/2012
TB4    CB      11/2/2012

其他表将它们链接在一起,但我可以将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伪代码,显示如何根据在另一个间接链接表中找到的排序来查找具有给定值的连续记录。或者,就此而言,如果它全部在一个表中,如上面的结果集,如何获得它。

2 个答案:

答案 0 :(得分:3)

听起来您会想要使用LAG和/或LEAD分析函数。所以,例如,

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

将根据flag返回该id值的date_column列的先前值。您也可以回顾多行

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

将获得前两行的值。同样,您可以使用LEAD获取下一行的值。

答案 1 :(得分:0)

听起来你正在寻找根据日期连续出现的记录数量。

为此,请执行以下操作:

(1)使用row_number()为每个col1值枚举月份:row_number() over (partition by col1)为seqnum_1。

(2)使用row_number()为每个col1,col2组合枚举月份:row_number() over (partition by col1, col2)为seqnum_2。

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

(4)对每个记录的每个组计算一次:count(*) over (partition by col1, seqnum_1 - seqnum_2) as thegroupsize

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