MySQL中获取首个峰值区间的最大Interval End问题求助
问题描述
我正在处理15秒时间区间的最小和最大时间戳查询,目标是找到存在峰值消息率的区间。当存在2个及以上峰值区间时,仅需第一个区间的数值。当前问题是用max()函数获取interval_end时,得到的是最晚区间的时间戳(2023-02-03 16:00:17.976),这是错误的,正确值应为首个峰值区间的2023-02-03 15:59:47.975,interval_start的最小值是正确的(2023-02-03 15:59:32.975)。现有SQL代码如下:
select day, interval_start, interval_end, peak_msgrate_incoming, max_peak_incoming_msgrate, min(if(peak_msgrate_incoming = max_peak_incoming_msgrate, interval_start, null)) as interval_start_peak_in, max(if(peak_msgrate_incoming = max_peak_incoming_msgrate, interval_end, null)) as interval_end_peak_out from table group by etc..
需要解决如何获取首个峰值区间的interval_end。
解决方案
要获取首个峰值区间的interval_end,核心是先锁定第一个峰值区间的起始时间,再匹配对应的结束时间,而非直接用max()函数取所有峰值区间的最晚结束时间。以下是两种可行方案:
方法一:窗口函数定位首个峰值区间
通过窗口函数给峰值区间按时间排序,直接筛选出第一个峰值区间的完整时间范围:
with peak_intervals as ( select day, interval_start, interval_end, peak_msgrate_incoming, max_peak_incoming_msgrate, -- 按时间给峰值区间排序,标记第一个峰值 row_number() over (partition by day order by interval_start) as rn from your_table where peak_msgrate_incoming = max_peak_incoming_msgrate ) select day, interval_start as interval_start_peak_in, interval_end as interval_end_peak_out from peak_intervals where rn = 1;
方法二:关联子查询匹配对应结束时间
利用已得到的正确interval_start_peak_in,关联原表获取对应的interval_end:
select day, interval_start_peak_in, (select interval_end from your_table t2 where t2.day = t1.day and t2.interval_start = t1.interval_start_peak_in) as interval_end_peak_out from ( select day, min(if(peak_msgrate_incoming = max_peak_incoming_msgrate, interval_start, null)) as interval_start_peak_in from your_table group by day ) t1;
核心逻辑说明
原代码中max(if(...))会返回所有峰值区间里最晚的interval_end,不符合需求;两种方案均先锁定首个峰值区间的起始时间,再匹配对应的结束时间,确保拿到的是第一个峰值区间的完整时间范围。
内容的提问来源于stack exchange,提问作者MtlTechGuy
相关产品推荐
相关产品推荐

