我有一个包含以下字段的事件表:
event_id
event_type
event_time
给定一个持续时间 D
和一个数字 k
,我需要计算所有超过 的
个事件。这基本上需要一个关于每个事件的滑动窗口。例如,我想要在任何 10 分钟的持续时间内事件超过 5 个事件的所有 event_type。event_type
在持续时间 D
的任何相对时间窗口中的 K
我不确定如何在没有窗口函数的情况下解决这个问题。
(我在 mysql 5.6 上。我说的是一个不到 100 万行的数据集。)
最佳答案
MySQL 不支持窗口函数,但您可以在 SELECT
列表中使用相关子查询来精确检索一列:
SELECT
event_id,
event_type,
event_time,
(SELECT COUNT(*) FROM events EC WHERE EC.event_type = E.event_type AND EC.event_time > E.event_time) AS subsequent_event_count
FROM
events E
WHERE ...
执行 EXPLAIN
它。这在执行逻辑方面与 SQL Server 中的 CROSS APPLY
有点相同。
另一种方法是自连接:
SELECT
E.event_id,
E.event_type,
E.event_time,
COUNT(EC.event_id) AS subsequent_event_count
FROM
events E
LEFT JOIN events EC
ON E.event_type = EC.event_type AND E.event_type < EC.event_type
GROUP BY
E.event_id,
E.event_type,
E.event_time
一定要测试这两种方法的性能。
你可以做更多有创意的加入,比如
EC.event_time > E.event_time AND EC.event_time < E.event_time + INTERVAL 1 DAY
关于Mysql窗口函数的解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37538350/