当前位置: 首页 > 面试题库 >

窗口功能的MySQL解决方法

汪明德
2023-03-14
问题内容

我有一个事件表,其中包含以下字段:

event_id
event_type 
event_time

给定一个持续时间D和一个数字k,我需要在持续时间的任何相对时间窗口中,对所有event_type大于K事件的事件进行计数D。这基本上需要针对每个事件的滑动窗口。例如,我希望所有event_type在10分钟的持续时间内具有超过5个事件的活动。

我不确定如何在没有窗口功能的情况下解决此问题。

(我使用的是mysql 5.6。我在说的是一百万行以下的数据集。)


问题答案:

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吧 就执行逻辑而言,这CROSS APPLY与SQL Server中的有点相似 。

另一种方法是自我加入:

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


 类似资料:
  • 问题内容: 我正在探索Hive中的窗口功能,并且能够理解所有UDF的功能。虽然,我无法理解我们与其他功能配合使用的分区和顺序。以下是与我计划构建的查询非常相似的结构。 只是试图了解两个关键字都涉及的后台过程。 感谢帮助:) 问题答案: 分析函数为数据集中每个分区的每一行分配一个等级。 子句确定行的分布方式(如果是配置单元,则在缩减程序之间)。 确定行在分区中的排序方式。 第一阶段由分配 ,数据集中

  • 问题内容: 运行以下代码: 结果是: 上面的代码中没有定义任何窗口框架,它看起来默认的窗口框架是 不确定我对默认窗口框架的理解是否正确 问题答案: 从Spark Gotchas 默认帧规格取决于给定窗口定义的其他方面: 如果指定了ORDER BY子句,并且该函数接受了帧规范,则该帧规范是由RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW定义的, 否

  • 我每年都通过联接进行

  • 本文向大家介绍ajax请求成功后新开窗口window.open()被拦截解决方法,包括了ajax请求成功后新开窗口window.open()被拦截解决方法的使用技巧和注意事项,需要的朋友参考一下 问题: 前面开发项目时碰到一个问题,ajax 异步请求成功后需要新开窗口打开 url,使用的是 window.open() 方法,但是很可惜被浏览器给拦截了,怎么解决这个问题呢? 分析: 浏览器之所以拦截

  • 本文向大家介绍DOS命令行窗口mysql中文显示乱码问题解决方法,包括了DOS命令行窗口mysql中文显示乱码问题解决方法的使用技巧和注意事项,需要的朋友参考一下 MySQL的默认编码是Latin1,不支持中文,如何修改MySQL的默认编码呢,下面以gbk为例来说明(这里只介绍Windows环境下) 1、中止MySQL服务(打开控制面板-->管理工具-->服务)找到MySQL,右键选择停止。 2、

  • 本文向大家介绍MySQL 的模块不能安装的解决方法,包括了MySQL 的模块不能安装的解决方法的使用技巧和注意事项,需要的朋友参考一下 我们最常用的 DBD::mysql 模块,我发现是难住很多人的地方.因为安装老是失败,下面我介绍一下解决方法,比如我使用 cpanm 安装,有时就出 /home/nue2501j/work/DBD-mysql-4.010/blib/arch/auto/DBD/my