回答

收藏

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

技术问答 技术问答 215 人阅读 | 0 人回复 | 2023-09-12

我需要编写一个查询,以显示分解结果,该结果FormID的值基于最近的值大于5 LogDate。2 X: S1 W9 s  k7 T' p8 _
根据最近一次LogDate,如果值小于5,则应该显示该点之后大于5的值,因为如果您愿意,则5以下的值将被“重置”。7 E( e; \. m; Y4 n
我实质上是在查看最近的连续LogDate记录,这些记录大于5。; o# B9 Z2 ?/ X8 n+ o
假设我们有以下记录集:" ?; N8 S9 y. D( a
FormID   Value  LogDate    4 ]3 U9 j) S4 I- T/ x6 ~
--------------------------
) _4 u. M, r" ^; p- J; z. }) GForm2    6      10/12/19   
/ o4 S/ f& ^! @Form2    7      10/13/19   $ X/ E0 D$ f9 e' ?+ N
Form1    8      10/12/19
* Q  g( J8 a2 e5 z  w6 n/ v3 E- vForm1    12     10/12/198 L. ?0 K1 F0 k, C
Form1    3      10/14/194 W( T7 I4 O$ E5 E
Form1    8      10/15/19+ [5 |- M+ b& {
Form1    6      10/21/19/ O  ?0 z% H. x& o
以下将返回以下内容(请注意,我也想显示row_num:
5 o4 t' c+ _+ p% J FormID   Value  LogDate   row_num
% E$ n, @3 d/ ?( p6 k ----------------------------------# K4 z7 l' @) n: N, R3 J7 b2 ^
Form2    6      10/12/19  15 h+ l% |) h- h% d, M
Form2    7      10/13/19  23 P; p9 {+ r* ?! ?  e
Form1    8      10/15/19  1
' D+ [9 n  y! I' m& Y+ D8 @ Form1    6      10/21/19  2, C3 J9 j8 `& ^
请注意,在上面的示例中,由于以下记录的最近值小于5(值3),因此我们需要获取大于5的记录。  D0 ^2 P' G* y$ B) O
另一个例子:0 O, F2 u2 @; G& ?
FormID   Value  LogDate     
0 U8 d% p% B) b6 Z; vForm1    8      10/15/19% w' _+ _6 g- q
Form1    3      10/21/193 ~5 o+ _9 x4 q
结果:不会显示任何结果,因为最近的记录中有大于5的记录6 p# K5 u5 B# ~6 O: P: e
另一个例子:
1 ?6 g7 |- D6 r8 J7 cFormID   Value  LogDate    & s1 h& G, G, G# R2 @
Form2    4      10/12/19   
5 p8 U1 w% r& `6 R4 O7 Q* H0 pForm2    3      10/13/19   
2 c( d% S5 \! ]: t5 cForm1    16     10/12/19. Y4 c( \( i0 u
Form1    3      10/12/19# D3 p+ Q/ X+ y
Form1    3      10/14/19
; |6 S' R' Q: I8 u0 u; d4 o# {6 NForm1    8      10/15/19) X; H( Y! L4 {! h0 ]7 z# `- ?, e
Form1    12     10/21/19: k- L- M' P6 F1 ~
结果是:0 o& J/ m$ B6 Y6 ]% g' x
FormID   Value  LogDate   row_num  U2 w. V# O; t
Form1    8      10/15/19  1
6 N) N" B7 @/ H+ YForm1    12     10/21/19  2
+ P& G, M- a* i- N+ f另一个例子:
' x6 }1 Y- r/ YFormID   Value  LogDate    9 ~( R$ E, F. X. `
Form1    12      10/12/19   
# f7 r7 W% q+ oForm2    13      10/13/19" H* ^" r. s$ U1 Q: M; P: l5 Y% N
结果:' C0 S# D0 z9 E$ u8 _1 c+ R, b8 T
FormID   Value  LogDate    row_num% @9 I  B5 I* n* j. f: @5 s
Form1    12      10/12/19  1 9 R8 |/ @: Z- f" K9 O+ g: h. d
Form2    13      10/13/19  2
' V0 b0 V1 T5 G' Z3 Y据我了解,这可以通过LAG函数来完成,但不确定如何将其完全结合在一起。, ^( M- N% f8 a% t  Z& w7 R
我们可以执行以下操作:0 E: Y. z, B  G( H8 C( R5 f5 T2 N
   DECLARE @mytable TABLE) |6 z" [9 i- p5 i/ ?; \  n
   (! _9 }# W$ ?8 n+ ]& z, E" J
     FormID VARCHAR(50),
, B/ S' j1 o. C     [Value] INT, ( I% \+ G9 N: W' {. H& R
     LogDate DATETIME; }6 a' H3 {  D# k
    )3 N7 z" c* N" S: f
    select t.*, # \" v) h- K) H( r5 ?
        lag(value) over(partition by formid order by logdate) lag_value+ C8 v2 e' c7 M( ~
    from @mytablet
* c5 K; c2 A& R( m5 b0 |但是不确定如何将它们组合在一起。
( N. y" H2 y( Z2 `. C1 |" H3 u& k                $ E3 \" k; p$ r5 \. |
解决方案:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则