Sql 读取数据库记录并转换为不同形式的查询/存储过程?
我有一个服务,每5分钟向服务器发送一次信息。我在DB中有以下一组记录:Sql 读取数据库记录并转换为不同形式的查询/存储过程?,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我有一个服务,每5分钟向服务器发送一次信息。我在DB中有以下一组记录: RecordId | sensorId | status | timestamp 1 | 3 | good | 07/31/2018 2:10:00.000 2 | 3 | good | 07/31/2018 2:15:00.000 3 | 3 | good | 07/31/2018 2:20:00.000 4 |
RecordId | sensorId | status | timestamp
1 | 3 | good | 07/31/2018 2:10:00.000
2 | 3 | good | 07/31/2018 2:15:00.000
3 | 3 | good | 07/31/2018 2:20:00.000
4 | 3 | good | 07/31/2018 2:25:00.000
5 | 3 | good | 07/31/2018 2:30:00.000
6 | 3 | bad | 07/31/2018 2:35:00.000
7 | 3 | bad | 07/31/2018 2:40:00.000
8 | 3 | good | 07/31/2018 2:45:00.000
9 | 3 | bad | 07/31/2018 2:50:00.000
现在我需要编写一个查询/存储过程来读取上述记录,并将数据按以下格式加载到另一个表中
id | sensorId | status | From | To
101 | 3| good | 07/31/2018 2:10:00.000 | 07/31/2018 2:30:00.000
102 | 3| bad | 07/31/2018 2:35:00.000 | 07/31/2018 2:40:00.000
103 | 3| good | 07/31/2018 2:45:00.000 | 07/31/2018 2:50:00.000
104 | 3| bad | 07/31/2018 2:50:00.000 | 07/31/2018 2:55:00.000
我们可以将给定表中的数据转换为上表中的数据吗?请建议转换数据的方法/解决方案?这称为“缺口和孤岛”问题。一个相对简单的解决方案是使用行数()的差异来识别相似状态的“孤岛”(
)
用您正在使用的数据库标记您的问题。
select sensorid, status, min(timestamp), max(timestamp)
from (select t.*,
row_number() over (partition by sensorid order by timestamp) as seqnum_s,
row_number() over (partition by sensorid, status order by timestamp) as seqnum_ss
from t
) t
group by sensorid, status, (seqnum_s - seqnum_ss);