我有一个带有timestamp列t的MySQL表。我需要创建另一个整数列(groupId),它对于带有时间戳的记录具有相同的值 不到3秒的差异。我的MySQL版本没有窗口功能支持。这是第二栏中的预期输出:
+---------------------+--------+
| t | groupId|
+---------------------+--------+
| 2017-06-17 18:15:13 | 1 |
| 2017-06-17 18:15:14 | 1 |
| 2017-06-17 20:30:06 | 2 |
| 2017-06-17 20:30:07 | 2 |
| 2017-06-17 22:44:58 | 3 |
| 2017-06-17 22:44:59 | 3 |
| 2017-06-17 23:59:50 | 4 |
| 2017-06-17 23:59:51 | 4 |
我尝试使用自联接和TIMESTAMPDIFF(SECOND,t1,t2)< 3
但我不知道如何生成唯一的groupId。
P.S。 数据的性质保证了没有连续范围的跨越> 3秒
答案 0 :(得分:1)
您可以使用变量执行此操作。
select tm
,@diff:=timestampdiff(second,@prev,tm)
,@prev:=tm
,@grp:=case when @diff<3 or @diff is null then @grp else @grp+1 end as groupID
from t
cross join (select @prev:='',@diff:=0,@grp:=1) r
order by tm
答案 1 :(得分:1)
为此,我认为您需要创建一个存储过程,首先按列t(时间戳)对表进行排序,然后对其进行分组并相应地分配groupId ....在这种情况下,您可以使用拥有计数器作为groupID。
这里重要的是,你如何将时间分成2秒的帧,你可以根据你的参考点结束不同的结果......
答案 2 :(得分:0)
当前一条记录仅为3秒时,此查询将每条记录放在同一组中:
UPDATE t
JOIN (
SELECT
t.*
, @gid := IF(TIMESTAMPDIFF(SECOND, @prev, t) > 3, @gid + 1, @gid) AS gid
, @prev := t
FROM t
, (SELECT @prev := NULL, @gid := 1) v
ORDER BY t
) sq ON t.t = sq.t
SET t.groupId = sq.gid;
答案 3 :(得分:0)
此查询适用于Oracle sql:
select *
from (
select e.*,
rank() over (partition by trunc(hiredate,'mi') order by trunc(hiredate,'mi') desc) MINu
from emp e
)