SQL:数据转置

问题描述 投票:0回答:1

我有一个输出以下内容的 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
sql sql-server transpose
1个回答
0
投票

您可以通过以下方式查找开始时间和结束时间:

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
© www.soinside.com 2019 - 2024. All rights reserved.