Sql 读取数据库记录并转换为不同形式的查询/存储过程?

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 |

我有一个服务,每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 |        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);