我有一个输出以下内容的 SQL 脚本:
时间戳 | 标签名 | 价值 |
---|---|---|
2024年12月19日15:00:57 | 跑步 | 0 |
2024年12月19日15:00:55 | 跑步 | 1 |
2024年12月19日14:53:38 | 跑步 | 0 |
2024年12月19日14:53:35 | 跑步 | 1 |
2024年12月19日14:53:08 | 跑步 | 0 |
2024年12月19日14:53:03 | 跑步 | 1 |
脚本需要获取此数据,当值为 1 时进行评估,然后将时间戳捕获为
StartTime
,当值为 0 时捕获时间戳为 EndTime
。此外,我需要查询一个具有与 RunID
关联的 StartTime
的表,并将其用于 RunID
。 RunID
由用户唯一设置(假设 RunID
是唯一的),当机器中的 Running 标签变为 1 时设置。
运行ID | 时间戳 |
---|---|
XYZ123 | 2024年12月19日15:00:55 |
XYZ980 | 2024年12月19日14:53:35 |
XYZ456 | 2024年12月19日14:53:03 |
最终输出应该是:
运行ID | 开始时间 | 末日 |
---|---|---|
XYZ456 | 2024年12月19日14:53:03 | 2024年12月19日14:53:08 |
XYZ980 | 2024年12月19日14:53:35 | 2024年12月19日14:53:38 |
XYZ123 | 2024年12月19日15:00:55 | 2024年12月19日15:00:57 |
您可以通过以下方式查找开始时间和结束时间:
select s.timestamp as StartTime, e.timestamp as EndTime
from t s
join t e
on s.value = 1 and e.value = 0 and e.timestamp > s.timestamp
left join bs
on bs.value = 1 and bs.timestamp between (s.timestamp and e.timestamp)
left join be
on be.value = 0 and be.timestamp between (s.timestamp and e.timestamp)
where bs.timestamp is null and be.timestamp is null
如果中间没有 e
或
s
,则
bs
是 be
的结尾。现在,让我们和跑步者一起加入:
select r.RunID, s.timestamp as StartTime, e.timestamp as EndTime
from t s
join t e
on s.value = 1 and e.value = 0 and e.timestamp > s.timestamp
left join bs
on bs.value = 1 and bs.timestamp between (s.timestamp and e.timestamp)
left join be
on be.value = 0 and be.timestamp between (s.timestamp and e.timestamp)
where bs.timestamp is null and be.timestamp is null
join runner r
on r.timestamp = s.timestamp