我需要编写一个MYSQL select查询来执行以下操作,可能使用Interval,但不确定如何实现。
检索结果组,其中相邻行的日期时间值在5分钟以内。在下面的简化示例中,我需要在一组中检索Bob,Ted和Fred,在另一组中检索Andy,Mike和Bert。
我不知道会有多少个小组。我需要能够确定每个组的开始时间,结束时间以及之间的数据收集。
一旦有了这些组,我就需要能够访问组中每一行的每个值,以便进行进一步的计算
**DB Table**
DateTime Value
2018-10-17 12:50 Bob
2018-10-17 12:55 Ted
2018-10-17 13:00 Fred
2018-10-17 15:00 Andy
2018-10-17 15:05 Mike
2018-10-17 15:10 Bert
答案 0 :(得分:2)
在MySql 5.x中,您可以使用变量来计算等级。
示例:
SELECT `DateTime`, `Value`,
CASE
WHEN @prev_dt >= `DateTime` - INTERVAL 5 MINUTE AND @prev_dt := `DateTime` THEN @rank
WHEN @prev_dt := `DateTime` THEN @rank := @rank + 1 -- this WHEN criteria is always true
END AS `Rank`
FROM YourTable t
CROSS JOIN (SELECT @prev_dt := NULL, @rank := 0) vars
ORDER BY `DateTime`;
您将在SQL Fiddle here上找到一个测试
结果:
DateTime Value Rank
-------------------- --- ----
2018-10-17T12:50:00Z Bob 1
2018-10-17T12:55:00Z Ted 1
2018-10-17T13:00:00Z Fred 1
2018-10-17T15:00:00Z Andy 2
2018-10-17T15:05:00Z Mike 2
2018-10-17T15:10:00Z Bert 2
在MySql 8.x中,您还可以使用窗口函数LAG来获取先前的DateTime。