admin

SQL Server:查找大于5的最近连续记录

sql

我需要编写一个查询,以显示分解结果,该结果FormID的值基于最近的值大于5 LogDate

根据最近一次LogDate,如果值小于5,则应该显示该点之后大于5的值,因为如果您愿意,则5以下的值将被“重置”。

我实质上是在查看最近的连续LogDate记录,这些记录大于5。

假设我们有以下记录集:

FormID   Value  LogDate    
--------------------------
Form2    6      10/12/19   
Form2    7      10/13/19   
Form1    8      10/12/19
Form1    12     10/12/19
Form1    3      10/14/19
Form1    8      10/15/19
Form1    6      10/21/19

以下将返回以下内容(请注意,我也想显示row_num:

 FormID   Value  LogDate   row_num
 ----------------------------------
 Form2    6      10/12/19  1
 Form2    7      10/13/19  2
 Form1    8      10/15/19  1
 Form1    6      10/21/19  2

请注意,在上面的示例中,由于以下记录的最近值小于5(值3),因此我们需要获取大于5的记录。

另一个例子:

FormID   Value  LogDate     
Form1    8      10/15/19
Form1    3      10/21/19

结果:不会显示任何结果,因为最近的记录中有大于5的记录

另一个例子:

FormID   Value  LogDate    
Form2    4      10/12/19   
Form2    3      10/13/19   
Form1    16     10/12/19
Form1    3      10/12/19
Form1    3      10/14/19
Form1    8      10/15/19
Form1    12     10/21/19

结果是:

FormID   Value  LogDate   row_num
Form1    8      10/15/19  1
Form1    12     10/21/19  2

另一个例子:

FormID   Value  LogDate    
Form1    12      10/12/19   
Form2    13      10/13/19

结果:

FormID   Value  LogDate    row_num
Form1    12      10/12/19  1 
Form2    13      10/13/19  2

据我了解,这可以通过LAG函数来完成,但不确定如何将其完全结合在一起。

我们可以执行以下操作:

   DECLARE @mytable TABLE
   (
     FormID VARCHAR(50), 
     [Value] INT, 
     LogDate DATETIME
    )

    select t.*, 
        lag(value) over(partition by formid order by logdate) lag_value
    from @mytablet

但是不确定如何将它们组合在一起。


阅读 351

收藏
2021-07-01

共1个答案

admin

如果我正确地遵循了您的说明,则可以使用如下窗口功能来做到这一点:

select 
from (
    select t.*, 
        row_number() over(partition by formid order by logdate desc) rn,
        sum(case when value > 5 then 1 else 0 end) over(partition by formid order by logdate desc) grp
    from mytable t
) t
where rn = grp

想法是将以上值的数量与5行号进行比较,从最近的值开始计数。两个值相等的行可以保留。

2021-07-01