You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL滑动窗口能否基于end-start指定动态时间区间?

动态滑动窗口区间的实现方案

首先明确:标准SQL中,窗口函数的RANGE BETWEEN子句不支持引用当前行的列值作为动态区间长度,你构想的INTERVAL (ROW.end - ROW.start) PRECEDING写法无法执行,因为窗口框架的边界必须是固定常量,不能随每行变化。

替代实现方式

如果要基于每行的end - start计算动态时间区间并统计范围内的记录数,可以采用以下两种方案(适配多数主流数据库):

方案1:关联子查询

假设表名为records,统计每个created_at对应的、在created_at - (end - start)到created_at区间内的记录数:

SELECT 
  created_at,
  (SELECT COUNT(*) 
   FROM records r2
   WHERE r2.created_at >= r1.created_at - (r1.end - r1.start)
     AND r2.created_at <= r1.created_at) AS cnt
FROM records r1
ORDER BY created_at;

方案2:LATERAL JOIN(更高效,适合大数据量)

适用于支持LATERAL语法的数据库(如PostgreSQL、MySQL 8.0+、SQL Server等):

SELECT 
  r1.created_at,
  COALESCE(r2.cnt, 0) AS cnt
FROM records r1
LEFT JOIN LATERAL (
  SELECT COUNT(*) AS cnt
  FROM records r2
  WHERE r2.created_at >= r1.created_at - (r1.end - r1.start)
    AND r2.created_at <= r1.created_at
) r2 ON true
ORDER BY r1.created_at;

关于原重叠统计目标的补充

你提到原目标是统计与当前记录start/end重叠的记录数,这个需求的正确判断逻辑应该是检测时间范围的交集,而非基于created_at的动态区间,示例SQL如下:

SELECT 
  r1.start,
  r1.end,
  (SELECT COUNT(*) 
   FROM records r2
   WHERE r2.start < r1.end 
     AND r2.end > r1.start) AS overlapping_cnt
FROM records r1;

这段SQL会统计所有与当前记录时间范围存在交集的记录数,更贴合重叠统计的实际需求。

内容的提问来源于stack exchange,提问作者James Lin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 21:29:52