MySQL:如何为具有接近时间戳的记录分配相同的ID

时间:2017-07-22 23:42:21

标签: mysql sql

我有一个带有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秒

4 个答案:

答案 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;
  • 看到它在sqlfiddle
  • 中正常工作
  • 详细了解用户定义的变量here

答案 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
)