我需要编写一个查询,以显示分解结果,该结果FormID的值基于最近的值大于5 LogDate。
FormID
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
但是不确定如何将它们组合在一起。
如果我正确地遵循了您的说明,则可以使用如下窗口功能来做到这一点:
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行号进行比较,从最近的值开始计数。两个值相等的行可以保留。
5