SQL中基于对应ID计算startTime与endTime的时间差(无需新建表)
解决方案
针对每个ID计算endTime与startTime的时间差,可通过以下两种方式直接查询,无需创建新表,同时解决你之前用LAG/LEAD时跨ID取值的问题:
方法1:条件聚合(推荐,适配每个ID仅一对start/end的场景)
SELECT ID, -- 计算时间差并转换为秒 EXTRACT(EPOCH FROM (MAX(CASE WHEN TypeTime = 'endTime' THEN DateTime END) - MAX(CASE WHEN TypeTime = 'startTime' THEN DateTime END))) AS "Duration (s)" FROM your_table_name GROUP BY ID;
方法2:修正窗口函数用法
如果偏好使用LAG/LEAD,需按ID分区,确保仅在同一ID范围内取前后行:
WITH time_pairs AS ( SELECT ID, DateTime, LEAD(DateTime) OVER (PARTITION BY ID ORDER BY TypeTime) AS end_time FROM your_table_name WHERE TypeTime = 'startTime' ) SELECT ID, EXTRACT(EPOCH FROM (end_time - DateTime)) AS "Duration (s)" FROM time_pairs;
适配不同数据库的时间差函数
若你的数据库不支持EXTRACT(EPOCH FROM ...),可替换为对应数据库的时间差函数:
- MySQL:
TIMESTAMPDIFF(SECOND, MAX(CASE WHEN TypeTime='startTime' THEN DateTime END), MAX(CASE WHEN TypeTime='endTime' THEN DateTime END)) - SQL Server:
DATEDIFF(second, MAX(CASE WHEN TypeTime='startTime' THEN DateTime END), MAX(CASE WHEN TypeTime='endTime' THEN DateTime END))
最终查询结果
| ID | Duration (s) |
|---|---|
| 1 | 60 |
| 2 | 240 |
| 3 | 360 |
内容的提问来源于stack exchange,提问作者Ammar
相关产品推荐
相关产品推荐

