回答

收藏

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

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

我需要编写一个查询,以显示分解结果,该结果FormID的值基于最近的值大于5 LogDate。  d% O8 z( l& t- D
根据最近一次LogDate,如果值小于5,则应该显示该点之后大于5的值,因为如果您愿意,则5以下的值将被“重置”。
" L( r  r; {. g' V我实质上是在查看最近的连续LogDate记录,这些记录大于5。
0 s/ r3 n/ W' S* s' `假设我们有以下记录集:3 K' g  c9 n& J  l
FormID   Value  LogDate    ) n# }5 T9 C. j9 |. Z' d5 h
--------------------------
8 A2 z+ i' ?6 ]$ ]! s1 ~. q2 U, C# }Form2    6      10/12/19   
5 |9 [2 v( n& o4 G$ WForm2    7      10/13/19     T" f4 a5 S% A
Form1    8      10/12/19) ~% p5 r. L. X: e6 q% u' ^
Form1    12     10/12/19  g$ ^9 H3 h* k5 X9 m$ [' R* J
Form1    3      10/14/19: R1 W/ o/ Z1 S+ ^. q% j' w
Form1    8      10/15/19
. u! E2 b/ m: v! k; X, p& b7 xForm1    6      10/21/19
1 X" x$ W4 c- ^. V; A" V以下将返回以下内容(请注意,我也想显示row_num:" \0 A7 M& v; _# |
FormID   Value  LogDate   row_num8 h7 F' r; i& c" h  M
----------------------------------4 F. n0 r% A+ S" a: w. ~
Form2    6      10/12/19  1
8 e+ e8 E$ x9 }# ?$ {$ k. t Form2    7      10/13/19  2
2 d/ h9 E; H: A- [- t6 H Form1    8      10/15/19  1
  k) ^" A3 H* Q( O/ F& {6 C" } Form1    6      10/21/19  2
6 [  U/ `; ]5 a; x请注意,在上面的示例中,由于以下记录的最近值小于5(值3),因此我们需要获取大于5的记录。
2 E7 t3 \7 b0 x2 H( z" C3 J  H另一个例子:5 ?5 K& K* q/ o7 w. B0 X
FormID   Value  LogDate     " g# O& N/ w+ b8 k; H/ M
Form1    8      10/15/19* c3 |# A0 ]: }0 d+ e% P4 P
Form1    3      10/21/194 N! T3 [3 l9 T* o4 ~1 n
结果:不会显示任何结果,因为最近的记录中有大于5的记录
4 h3 L4 {; b( S, Z: z- P$ F另一个例子:
. Q6 m% e) _! H9 h! E" LFormID   Value  LogDate   
  Z" o5 d! ^* P) W0 P8 G0 F) Y, U( q& vForm2    4      10/12/19   
- u* Y, c4 x8 e4 yForm2    3      10/13/19   ! O9 G( `$ t0 Q
Form1    16     10/12/19
. v; f5 J% T9 X( d1 HForm1    3      10/12/19. w  A. N+ H3 t8 T3 s
Form1    3      10/14/19
: m9 M: q: _" Q5 @4 Z  a8 B# N1 mForm1    8      10/15/19
7 ~7 ~) {- f+ x5 tForm1    12     10/21/19! e5 d+ w; j2 W5 q
结果是:( W+ V8 x) i2 g1 @6 Z9 E$ z, Z( E
FormID   Value  LogDate   row_num' n7 L$ [5 q( h
Form1    8      10/15/19  1
$ D% {* p: K" ]Form1    12     10/21/19  2' W# G' _8 k7 X
另一个例子:
0 k) J+ @9 B' [6 HFormID   Value  LogDate    3 o: G6 q! |" ~* M
Form1    12      10/12/19   # T5 @0 I0 ?: c1 K/ T+ C$ T( F& V
Form2    13      10/13/19
- B1 x% Z0 i) u: o9 _结果:" N3 {# U& B5 `  c3 E
FormID   Value  LogDate    row_num# W) j8 a3 U7 L( k, H
Form1    12      10/12/19  1
4 \- {8 s* V/ V0 a0 ~- NForm2    13      10/13/19  2
6 x1 F! S1 V9 A2 @2 @! S据我了解,这可以通过LAG函数来完成,但不确定如何将其完全结合在一起。
! u- j+ }' L, j我们可以执行以下操作:
1 x& Q$ P" \9 C$ n4 |   DECLARE @mytable TABLE9 |% G0 N7 U9 ]
   ($ ^- z" E2 |. ]* _8 i8 \5 u
     FormID VARCHAR(50),
( x1 i. [( S# [6 {* f* T0 v1 `% E0 E     [Value] INT, ; Y! k& l9 s, H5 Q8 Q
     LogDate DATETIME2 ?  K$ ?8 E* ^9 c  }. T
    )
+ C) F* ]6 B6 U2 O9 O. {; N    select t.*,
2 _( h# w+ r/ L+ R6 ~8 l        lag(value) over(partition by formid order by logdate) lag_value
7 p2 A) v& `$ s% u# c+ B9 _; `    from @mytablet
8 P( f% [1 |- N, g但是不确定如何将它们组合在一起。- m  n5 F8 |: q. f) t$ J
                  c9 E/ H7 a8 ^1 H4 @( W8 I% _
解决方案:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则