0

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

4

2 回答 2

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来获取下一行的值。

于 2013-03-06T22:44:27.183 回答
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 个或更多元素的位置。

于 2013-03-06T22:57:44.313 回答