回答

收藏

使用SQL检测异常间隔

技术问答 技术问答 177 人阅读 | 0 人回复 | 2023-09-14

我的问题很简单:我有一个包含一系列状态和时间戳的表(出于好奇,这些状态表示警报级别),我想查询该表以获取两个状态之间的持续时间。
9 F+ Z0 _) C# A看起来很简单,但是棘手的部分到了:我不能创建查找表,过程,并且它应该尽可能快,因为该表是一个拥有超过10亿条记录的小怪兽(没有在开玩笑!)…. _" j2 s7 [/ s
该模式非常简单:
- q7 N/ @% P9 ]. b  \7 T[pk]时间值
5 {9 U3 E) p% H) h(实际上,还有第二个pk,但是对此没有用)( q  F- Q+ \' }$ \. v+ K4 x
在一个真实的例子下面:
# f# m. g# D) p3 x: J+ O+ M时间戳状态
4 x; n  A1 ~9 F; o8 N0 A: Z$ f' ^2013-1-1 00:00:00 1( [1 ]& H1 i* \
2013-1-1 00:00:05 28 ]8 }  D8 r; Z( N' ]9 q1 V
2013-1-1 00:00:10 2
" y9 ^* y, t3 I2013-1-1 00:00:15 21 U; {, H: Z, U& N2 v1 ~, E! H
2013-1-1 00:00:20 0
$ X! U+ O: t3 X2 ^2013-1-1 00:00:25 1/ z* ]$ `, ?$ w
2013-1-1 00:00:30 2( x; z& ?" t1 G) X7 k" t
2013-1-1 00:00:35 2* i7 u  Y) Y, o8 O: E6 a# A6 |
2013-1-1 00:00:40 0) C. q- ]  Z" g
仅考虑2级警报的输出应如下所示,应报告2级警报的开始及其结束(达到0时):" _3 o/ `: k9 [' y$ B
StartTime结束时间间隔" ]2 q( ^8 Z6 g) B
2013-1-1 00:00:05 2013-1-1 00:00:20 15, G& L4 y1 n8 S
2013-1-1 00:00:30 2013-1-1 00:00:40 10
/ |  A+ H& k2 L& ~) k我一直在尝试各种内部联接,但是所有这些都使我进入了惊人的笛卡尔爆炸。你们可以帮我找出实现此目标的方法吗?
& a5 a" N6 G) I" I/ V/ _5 j谢谢!/ b4 a; K' N5 a8 `4 L3 E$ {
                + ~+ a) ~' o/ ]: G6 H
解决方案:+ _/ `& Z( l  n3 o" o$ e
               
' ~( W6 C/ K, m, m
3 s( q8 m: E* ^( V. ~7 m5 d. ]. s  l. M0 F1 v
                这一定是我今天看到的最困难的问题之一-谢谢!我认为您可以使用CTE?如果是这样,请尝试以下操作:0 e- r5 Y: X+ }
;WITH Filtered
2 {+ B+ |+ n; j9 g& ^AS
. T/ q/ |# M5 x4 g(1 f  m6 f3 S+ e1 m. q0 k( w: _
    SELECT ROW_NUMBER() OVER (ORDER BY dateField) RN, dateField, Status
( E9 G0 @4 l4 e& H  s    FROM Test    ' ?; |9 e- {" N: R/ q2 [2 Y5 E' ?
)! O# z4 [- E. v! O* I$ Q
SELECT F1.RN, F3.MinRN,
. b3 _# K& ]: l) X6 |+ D    F1.dateField StartDate,- T% Y8 {$ S) P, C
    F2.dateField Enddate+ R2 u1 H. L9 L8 a" ?' ]: ~3 q
FROM Filtered      F1, Filtered F2, (
$ W) r1 b. `# i) a- T4 k. _3 eSELECT F1a.RN, MIN(F3a.RN) as MinRN9 L0 B" [# q1 [2 y5 I! O
FROM Filtered      F1a
6 o) p6 i+ Z4 Z  N2 h, d$ v   JOIN Filtered F2a ON F1a.RN = F2a.RN+1 AND F1a.Status = 2 AND F2a.Status  2
! |/ d8 C: @% |8 H3 X9 C: ], L   JOIN Filtered F3a ON F1a.RN  2( ]% o  k# E' l' U
GROUP BY F1a.RN ) F3
/ d6 h% I5 a7 @$ w% MWHERE F1.RN = F3.RN AND F2.RN = F3.MinRN+ E( J6 {! \7 K. d/ n
和小提琴。我没有添加间隔,但是我想您可以从这里开始处理该部分。
+ O8 r. U; e4 a) C3 P  I祝你好运。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则