如何偏移重复时间戳使其唯一?Excel与SQL方案咨询
处理重复时间戳的解决方案
Excel工作表实现
1. 生成重复组索引列
假设数据分布在:
- A列:USER_ID
- B列:TRUNC DSTAMP
- C列:TIME
在D2单元格输入以下公式(Excel 365/2021支持动态数组,自动填充整列;旧版Excel需下拉填充):=COUNTIFS($A$2:A2,A2,$B$2:B2,B2,$C$2:C2,C2)
该公式会为同一用户、同一日期、同一时间的条目生成连续索引(1、2、3...),第一条重复项为1,后续依次递增。
2. 生成唯一时间戳列
在E2单元格输入公式,将原时间加上(索引值-1)秒,保证每组内的时间唯一:=C2 + (D2-1)/86400
(Excel中1天=86400秒,因此1秒对应数值为1/86400)
SQL实现
假设数据表名为user_time_records,字段为user_id、trunc_dstamp、time_val(避免使用关键字TIME),利用窗口函数生成组内索引,再为重复时间添加偏移:
SELECT user_id, trunc_dstamp, time_val, -- 不同SQL方言的时间偏移语法: -- MySQL/MariaDB: ADDTIME(time_val, SEC_TO_TIME(ROW_NUMBER() OVER (PARTITION BY user_id, trunc_dstamp, time_val) - 1)) AS unique_time, -- PostgreSQL: -- time_val + (ROW_NUMBER() OVER (PARTITION BY user_id, trunc_dstamp, time_val) - 1 || ' seconds')::INTERVAL AS unique_time, -- SQL Server: -- DATEADD(SECOND, ROW_NUMBER() OVER (PARTITION BY user_id, trunc_dstamp, time_val) - 1, time_val) AS unique_time FROM user_time_records ORDER BY user_id, trunc_dstamp, time_val;
PARTITION BY按用户、日期、时间分组,ROW_NUMBER()为每组内条目编号,通过对应SQL的时间函数将编号减1后作为秒数偏移,实现所有时间戳唯一。
样本数据
| USER_ID | TRUNC DSTAMP | TIME |
|---|---|---|
| 487DUJE | 9/23/2024 | 12:05:48 pm |
| 487CEMA | 9/23/2024 | 09:32:32 am |
| 487CEMA | 9/23/2024 | 09:30:37 am |
| 487CEMA | 9/23/2024 | 09:31:21 am |
| 487CEMA | 9/23/2024 | 09:31:22 am |
| 487CEMA | 9/23/2024 | 09:32:32 am |
| 487CEMA | 9/23/2024 | 09:33:25 am |
| 487CEMA | 9/23/2024 | 09:33:25 am |
| 487CEMA | 9/23/2024 | 09:51:41 am |
| 487CEMA | 9/23/2024 | 09:54:47 am |
| 487CEMA | 9/23/2024 | 10:20:16 am |
| 487TEMP30 | 9/23/2024 | 12:18:14 pm |
| 487CEMA | 9/23/2024 | 09:43:53 am |
| 487CEMA | 9/23/2024 | 09:46:05 am |
| 487CEMA | 9/23/2024 | 09:41:11 am |
| 487CEMA | 9/23/2024 | 09:41:43 am |
| 487CEMA | 9/23/2024 | 09:42:21 am |
| 487CEMA | 9/23/2024 | 09:42:50 am |
| 487CEMA | 9/23/2024 | 09:43:18 am |
| 487CEMA | 9/23/2024 | 09:43:50 am |
| 487CEMA | 9/23/2024 | 09:44:59 am |
| 487CEMA | 9/23/2024 | 09:45:30 am |
| 487CEMA | 9/23/2024 | 09:47:03 am |
| 487CEMA | 9/23/2024 | 09:47:37 am |
| 487CEMA | 9/23/2024 | 09:47:03 am |
| 487TEMP30 | 9/23/2024 | 12:22:38 pm |
| 487DUJE | 9/23/2024 | 12:06:45 pm |
| 487DUJE | 9/23/2024 | 12:20:31 pm |
| 487DUJE | 9/23/2024 | 12:34:45 pm |
| 487DUJE | 9/23/2024 | 11:50:04 am |
| 487SOMA | 9/23/2024 | 12:21:37 pm |
| 487DUJE | 9/23/2024 | 12:18:17 pm |
| 487CEMA | 9/23/2024 | 10:13:36 am |
| 487CEMA | 9/23/2024 | 10:15:05 am |
| 487CEMA | 9/23/2024 | 10:15:05 am |
内容的提问来源于stack exchange,提问作者joseph crujeiras
相关产品推荐
相关产品推荐

