回答

收藏

窗口功能的MySQL解决方法

技术问答 技术问答 55 人阅读 | 0 人回复 | 2023-09-13

我有一个事件表,其中包含以下字段:. {; l0 i. A2 P+ D: g! \2 A0 b
event_id
; d. J% |' J1 L6 `% ^* k' _event_type
: p9 f) p6 G- R# l3 j4 W; _2 aevent_time5 F- Y: B* K! _& r, X
给定一个持续时间D和一个数字k,我需要在持续时间的任何相对时间窗口中,对所有event_type大于K事件的事件进行计数D。这基本上需要针对每个事件的滑动窗口。例如,我希望所有event_type在10分钟的持续时间内具有超过5个事件的活动。
! s8 T8 g2 M5 S6 t" @7 c我不确定如何在没有窗口功能的情况下解决此问题。, Y) i2 M1 o: l/ F* ~% c0 D
(我使用的是mysql 5.6。我在说的是一百万行以下的数据集。)
8 {+ \5 L( K1 a& P$ T) h5 Y. k0 F               
4 G( {0 g0 `$ t解决方案:/ W& u) |: X+ M5 Y+ p( e: `
                / H2 S6 {8 b1 l" N3 {

6 U4 z. _: R# E& p: }2 E5 r3 s+ c% d6 o- ?4 I& [
                MySQL不支持窗口功能,但是您可以在SELECT列表中使用相关子查询来精确检索一列:
( K, v) Q' J- D; Q$ KSELECT
- [& U2 y/ j) V. y% y  event_id,
" G# r/ k2 ~  r  c  event_type,
* {$ W' Z3 ~  R/ h# f5 l4 I  event_time,9 d+ }6 A8 R  J4 P( [( P" \
  (SELECT COUNT(*) FROM events EC WHERE EC.event_type = E.event_type AND EC.event_time > E.event_time) AS subsequent_event_count
, y( e7 \& o* ~' W$ bFROM
' F- N3 Z& @4 I' c; X2 d5 E2 f  events E
# Q" E4 M/ ?, e* [! t& uWHERE ...
" D% B1 _7 h& d# B! |, Q% s9 c做EXPLAIN吧 就执行逻辑而言,这CROSS APPLY与SQL Server中的有点相似 。( Z; I0 E' }7 m( l7 E; F# B
另一种方法是自我加入:2 R' ^' L# ~# \* P! f
SELECT* d1 O% m( O$ F" U
  E.event_id,
& F# p2 m* \  `# K  E.event_type,6 b# c3 m' w2 F& Q* s% g
  E.event_time,+ [% L" G- G: _: [
  COUNT(EC.event_id) AS subsequent_event_count4 e, }, [" J1 _
FROM
( A) }. D  S' o- v% z  events E. ^: Y9 e+ W1 }* |0 t
  LEFT JOIN events EC! X0 d( F/ X% }3 H- B
    ON E.event_type = EC.event_type AND E.event_type 请测试两种方法的性能。9 @- l2 l6 Z. O3 ]( p; b  `* `6 w8 x
您可以进行更多的创意连接,例如% z4 ~6 G0 ?2 V0 N
EC.event_time > E.event_time AND EC.event_time < E.event_time + INTERVAL 1 DAY
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则