回答

收藏

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

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

我需要编写一个查询,以显示分解结果,该结果FormID的值基于最近的值大于5 LogDate。
: s: [: V. E4 I. ]  q9 N+ }根据最近一次LogDate,如果值小于5,则应该显示该点之后大于5的值,因为如果您愿意,则5以下的值将被“重置”。
! I: i2 [) h8 T/ ?2 M' A我实质上是在查看最近的连续LogDate记录,这些记录大于5。
. c9 ?; j) r9 ?7 a6 R假设我们有以下记录集:2 c# d: I9 P+ j% }8 G( k
FormID   Value  LogDate   
# C% V# \! O* J/ \; `  i# y  @--------------------------
: J7 X/ B3 @6 E; X( v5 n* YForm2    6      10/12/19   
4 z8 _& s# l1 r) K7 y9 ^9 CForm2    7      10/13/19   
" ~7 S5 G3 S0 m! EForm1    8      10/12/19
6 q; d! I# b; i; A# dForm1    12     10/12/19
" |; ]& H) |  s: M2 E8 c) nForm1    3      10/14/19
# a4 S3 ^/ H+ R6 PForm1    8      10/15/19
7 c& Y' n& q" N7 o" L$ b8 R& ^Form1    6      10/21/19/ P' g$ K/ y2 ~. }+ G0 O2 \
以下将返回以下内容(请注意,我也想显示row_num:5 i5 N# m* i1 c  W6 o4 O0 O
FormID   Value  LogDate   row_num
1 k- o$ k9 _  x! a2 p2 B; x1 @ ----------------------------------
! X' o9 o- @' S1 X2 b Form2    6      10/12/19  1( I3 W0 j' ?- `4 b- d4 C9 N
Form2    7      10/13/19  25 I, }( }* @9 H6 `$ H
Form1    8      10/15/19  1
* {- j2 r% _( b! F Form1    6      10/21/19  2' v* T7 _# _. a; o( m0 H
请注意,在上面的示例中,由于以下记录的最近值小于5(值3),因此我们需要获取大于5的记录。3 D5 L; T; u& K: h7 g; u
另一个例子:
8 w- Q$ N7 b  o7 q( i+ ]FormID   Value  LogDate     
7 t3 h. Z, M; d) [  g% C/ mForm1    8      10/15/19
) F+ k- g3 V2 @( k! FForm1    3      10/21/195 E4 a, \/ ^+ Q! ^1 L
结果:不会显示任何结果,因为最近的记录中有大于5的记录9 [) O( N/ C' i) {. O
另一个例子:
2 j9 |- g9 Z" ]7 K+ @0 {FormID   Value  LogDate    6 v/ g: B' b* J
Form2    4      10/12/19   
% ?# P+ D# j2 |! I* b/ `! Y7 l) \6 hForm2    3      10/13/19   
8 M$ z+ t4 y1 _( MForm1    16     10/12/19
6 t0 c' X" s- f5 c, @; U& n' J- P, rForm1    3      10/12/19- A/ Y! [2 g& F9 L# s
Form1    3      10/14/19& ]4 y6 _* S5 u" g8 K( u; d
Form1    8      10/15/198 n7 k) S6 I6 S* p6 p/ l8 J
Form1    12     10/21/19
- m9 e1 A! P1 N+ v4 b结果是:
3 P  R, V, _6 F! A0 D+ m; DFormID   Value  LogDate   row_num4 I0 @: t$ `" f$ y
Form1    8      10/15/19  1
1 _1 ~2 D5 E0 ^/ w5 X5 cForm1    12     10/21/19  2
$ B( H4 b+ f. F& X另一个例子:
8 ?9 h; l* ?4 R* z. i" }# HFormID   Value  LogDate   
+ F& I% u' U. I2 y, c+ IForm1    12      10/12/19   7 {1 z( \& M+ m7 x( r
Form2    13      10/13/19+ R% P6 V* x1 }9 e
结果:
+ x% f  x3 M, G! Z8 X; CFormID   Value  LogDate    row_num
% V. z9 }" W) s+ P5 x- f1 @Form1    12      10/12/19  1 7 C* G( Q) _) ?" C
Form2    13      10/13/19  2+ M2 O. `2 J2 x. f! |" A( O
据我了解,这可以通过LAG函数来完成,但不确定如何将其完全结合在一起。
( v) {  v9 q$ `; i我们可以执行以下操作:' p- r" |% E; P. i: @
   DECLARE @mytable TABLE  t8 M* d: t" r  Y* e2 i
   (
- ]# G; ~: B2 U0 G3 j8 m     FormID VARCHAR(50),
* M7 e- p: X  Q) L6 `+ R9 `& T     [Value] INT, # D$ X- |3 X; A4 u
     LogDate DATETIME) i* M2 C4 ^2 O
    )3 ?' ], ^' k% R+ T0 \- m
    select t.*, # D* f2 W- e& ]
        lag(value) over(partition by formid order by logdate) lag_value
8 f2 u; h2 ~5 O% q    from @mytablet
6 Z8 t# O4 c& z; W6 @; \但是不确定如何将它们组合在一起。
: |3 ?8 C8 c% I" G                8 k7 i$ g% N* g% k: w+ p. g
解决方案:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则