回答

收藏

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

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

我需要编写一个查询,以显示分解结果,该结果FormID的值基于最近的值大于5 LogDate。8 y/ Y% J, h$ Y8 T+ B
根据最近一次LogDate,如果值小于5,则应该显示该点之后大于5的值,因为如果您愿意,则5以下的值将被“重置”。) |+ ]6 j8 x& O2 H4 I9 A. Y
我实质上是在查看最近的连续LogDate记录,这些记录大于5。
  j- F' m* {  _' R- w8 h, K假设我们有以下记录集:& P5 }' r8 ^( z: r
FormID   Value  LogDate    * u& |+ p: J* d7 ^
--------------------------% B  s1 F% \3 @1 C  T. G
Form2    6      10/12/19   
% r7 g) h, D/ q, j3 p, Q" ^Form2    7      10/13/19   , W, ~! W! [9 p8 r& F$ O
Form1    8      10/12/191 Q6 i  u6 I' K1 J6 n& Z( a9 K* G1 [
Form1    12     10/12/19, t6 w& Q- V5 `9 F
Form1    3      10/14/19- m4 P2 R" X6 R7 d
Form1    8      10/15/19
+ W+ P; ?. N: i% X/ R2 b( ?# K# {Form1    6      10/21/198 b4 L3 V  Q- e
以下将返回以下内容(请注意,我也想显示row_num:
6 Q; w, N# _+ a5 r4 ?: u9 l FormID   Value  LogDate   row_num
- x& e9 I; x1 v) _ ----------------------------------
) ?# I$ Z0 X8 S7 f" D( c4 ?& j Form2    6      10/12/19  1( M. |, e9 c2 G" ]; l& i4 J
Form2    7      10/13/19  2
; J+ ^4 K) h3 e" t" H Form1    8      10/15/19  1
9 W7 i5 I7 o' `' c; | Form1    6      10/21/19  2
' q( k+ }; i) z0 {( |请注意,在上面的示例中,由于以下记录的最近值小于5(值3),因此我们需要获取大于5的记录。5 o& n8 Z5 E* ~$ w5 H! w
另一个例子:
; R/ |) C% j5 OFormID   Value  LogDate     
7 p+ R/ [' U' TForm1    8      10/15/19
  t& O: M  Z% x# S5 v; M) b3 XForm1    3      10/21/194 L  s* f( {# z1 D* r
结果:不会显示任何结果,因为最近的记录中有大于5的记录
0 ?% \6 w9 q: O' Y4 |7 V* ]5 L# y另一个例子:
6 U  ~6 b7 b% NFormID   Value  LogDate   
( ~' N1 \7 X, Q& E9 AForm2    4      10/12/19   + U' f' D/ U- Q: f9 y& Q5 ?% O, ?* c
Form2    3      10/13/19   . J. ?6 j+ k. p" G1 Y3 P! [+ ]
Form1    16     10/12/19
, w7 G  x; P+ i( S$ W# ^2 pForm1    3      10/12/19
+ j( g: t1 J( {! s# r6 u" eForm1    3      10/14/19% I) x( ]! \8 |
Form1    8      10/15/19# j8 M1 c3 p6 g* m4 n+ @# Y. [
Form1    12     10/21/19
) D/ I6 ?! t* b! H, O结果是:
% y+ B1 u7 r* R3 S8 h! IFormID   Value  LogDate   row_num# k; g$ h  O0 J& l/ p' k1 q
Form1    8      10/15/19  1
/ `) y4 D, x8 @% @8 x/ IForm1    12     10/21/19  25 A. q9 Y3 l! O
另一个例子:
) x3 C  `6 z, ^FormID   Value  LogDate   
7 Q6 E- Z" _: M* i! S+ ~" IForm1    12      10/12/19   
8 B, I3 _) J. i" ], PForm2    13      10/13/191 a8 q6 v4 N4 m, J0 X
结果:
* Y) z  ]" N. z4 x) E+ `9 t1 gFormID   Value  LogDate    row_num
% C  M# ~. X; b4 A; k! X3 bForm1    12      10/12/19  1 - V8 }2 l  H% c+ w) Y1 i# x9 Z
Form2    13      10/13/19  2
" V7 C: P" n+ i, U2 r2 d据我了解,这可以通过LAG函数来完成,但不确定如何将其完全结合在一起。
/ D3 M3 q6 x9 O; R3 ^我们可以执行以下操作:
! D5 p% K4 f9 t2 ]1 t% Y   DECLARE @mytable TABLE. F3 ~' {) O! c- k
   (' T( `3 }- d* N) @5 [1 X; E
     FormID VARCHAR(50),
) C( P- m. B( C     [Value] INT, ' t, p, c7 t- ?. ]/ O4 S0 {
     LogDate DATETIME
( \* a$ h% l* t' `' [9 [2 @" B    )
5 h( ?: \( V7 l    select t.*,
4 u" x9 c" T; o. l$ K        lag(value) over(partition by formid order by logdate) lag_value
7 x  Z* t; X( g% t: g    from @mytablet4 D9 {* }: R* a- L6 H/ r' x
但是不确定如何将它们组合在一起。9 o5 Y/ @' D/ P0 z/ h
                ' Z- P0 F! M9 E9 d# Z. o
解决方案:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则