回答

收藏

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

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

我需要编写一个查询,以显示分解结果,该结果FormID的值基于最近的值大于5 LogDate。: J* {$ l( Q/ G0 K; A4 q
根据最近一次LogDate,如果值小于5,则应该显示该点之后大于5的值,因为如果您愿意,则5以下的值将被“重置”。) D; x, v& Q: S& Q
我实质上是在查看最近的连续LogDate记录,这些记录大于5。
3 m; A: ?8 H1 W0 x8 V假设我们有以下记录集:
' w8 E( D/ g6 Q$ t9 FFormID   Value  LogDate   
# k9 Z; ~( I0 x8 H& y! Z--------------------------+ F7 Z0 S/ P" V4 g% A& R
Form2    6      10/12/19   0 T0 v/ P; n- G9 y) e
Form2    7      10/13/19   
& H3 _2 C7 e, N2 OForm1    8      10/12/190 |' w7 }. ?" o  J
Form1    12     10/12/194 l: r0 a3 t7 b( Z0 y
Form1    3      10/14/193 p( ^. L  q0 ?! J$ D5 {  l
Form1    8      10/15/19) t+ u' s, g: r* c
Form1    6      10/21/19
7 V- N' u0 L9 [. R以下将返回以下内容(请注意,我也想显示row_num:
. T7 T# l9 a. u$ q FormID   Value  LogDate   row_num8 {1 c9 A; _! a/ L
----------------------------------
2 K- g1 d' d4 J; ^" j) f) N Form2    6      10/12/19  1/ q$ N) C. V* D" |1 y
Form2    7      10/13/19  2  a; O" Z5 H. F- W3 @. m
Form1    8      10/15/19  1
" u' k- G; u1 G2 X+ \( ]+ Z# Q- A% O Form1    6      10/21/19  29 `" M! n3 m* o! x' i0 Z
请注意,在上面的示例中,由于以下记录的最近值小于5(值3),因此我们需要获取大于5的记录。
1 F4 ~+ V5 @5 m8 l  Q/ e9 d2 T另一个例子:, |. j# g6 B' l7 R
FormID   Value  LogDate     : O- B* R8 |7 o% P4 k
Form1    8      10/15/19
' |, @4 b, r1 SForm1    3      10/21/19
4 ^- v0 A9 B: b. J" e) M( L# ^结果:不会显示任何结果,因为最近的记录中有大于5的记录; q7 }# S' a* {4 y
另一个例子:
7 t+ E1 i9 h" E1 z* aFormID   Value  LogDate   
* Z) ]& m0 e  O1 X- L( c2 D2 DForm2    4      10/12/19   7 }  Q* k: i% |7 ?2 K0 T) e
Form2    3      10/13/19   & D8 b, Q4 E5 I% V& @9 ^
Form1    16     10/12/19
0 T, V1 v: K3 b! u: L& V1 TForm1    3      10/12/19# G' m, g, c+ U& Y) M
Form1    3      10/14/19/ P; s6 v6 Z$ g! F- o0 o/ M: p
Form1    8      10/15/19! k' Q$ ~! d; G
Form1    12     10/21/19
& _$ ~: t; S* j0 Q. D- v结果是:
+ {( b  Y! j3 s# O' ^4 [FormID   Value  LogDate   row_num
. q8 b9 F! x# f: d5 b. eForm1    8      10/15/19  1
9 r5 U/ W6 }. q3 B% R$ N! xForm1    12     10/21/19  2* J9 l+ \$ V* {) n8 H
另一个例子:0 t2 ^9 @5 r" Q8 d' B4 h  _# _6 m
FormID   Value  LogDate    8 ]7 R0 B" \6 {
Form1    12      10/12/19   
9 O7 l; a5 ~8 G4 JForm2    13      10/13/19
2 p" P) M) l: @. C/ P3 ?结果:
; e( @7 S( }2 N3 @FormID   Value  LogDate    row_num
' I  ]; d, P$ m( sForm1    12      10/12/19  1
% E* L: J" L. @Form2    13      10/13/19  2
0 W9 s3 G) e8 |2 w) d% P据我了解,这可以通过LAG函数来完成,但不确定如何将其完全结合在一起。
( Y6 u' w* w2 S" \0 o  b4 u+ j我们可以执行以下操作:
; _' V" j% G  |% i* K   DECLARE @mytable TABLE) f5 o+ m' \5 W( Q
   (7 E* ~% |; r2 f% {2 c
     FormID VARCHAR(50),
/ K# O, k- U0 Y3 K     [Value] INT, ! z# _- i+ A2 b
     LogDate DATETIME2 U" a7 w3 z% G
    )1 O7 q$ ?5 Y6 k" ^8 p& Y
    select t.*, 5 w8 m' v3 P6 y" R% |, g- G
        lag(value) over(partition by formid order by logdate) lag_value8 n5 D' }0 o0 }/ K/ ~8 b) Y4 ^
    from @mytablet+ I! o, ~: o  V7 n& Y, d6 M; c% ]
但是不确定如何将它们组合在一起。
1 q8 B& s! h, J. Q6 G                , t& R& L3 |: J% W
解决方案:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则