我有几个链接表,我正在尝试查找其中一个子表在一行中具有给定值的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伪代码,显示如何根据在另一个间接链接表中找到的排序来查找具有给定值的连续记录。或者,就此而言,如果它全部在一个表中,如上面的结果集,如何获得它。
答案 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个或更多元素的位置。