sql - 时间序列数据的自连接

标签 sql join

我需要一些帮助,我认为应该是一个相当简单的自连接查询。只需将两条记录匹配的开始时间和结束时间合并为一条记录即可

假设我在表格中有以下内容

Time  Event
08:00 Start
09:00 Stop
10:30 Start
10:45 Stop
11:00 Start
11:15 Start
12:00 Stop
12:30 Stop

我想要这样的景色

StartTime Stoptime
08:00  09:00 
10:30  10:45 
11:00 
11:15  12:00 
       12:30 

注意它应该找到最接近的匹配开始或结束时间。如果由于某种原因没有匹配的事件,它应该留空。

谢谢,

最佳答案

免责声明: 我会认真考虑不同的表设计。在日期和/或时间加入从来都不是一个好主意。如果您有开始的事件的 ID,则可以轻松地通过 LEFT JOIN 尝试找到该事件的匹配结束。

对于 SQL Server 尝试:

DECLARE @Events  table (EventTime char(5), EventType varchar(5))

INSERT INTO @Events VALUES ('08:00','Start')
INSERT INTO @Events VALUES ('09:00','Stop')
INSERT INTO @Events VALUES ('10:30','Start')
INSERT INTO @Events VALUES ('10:45','Stop')
INSERT INTO @Events VALUES ('11:00','Start')
INSERT INTO @Events VALUES ('11:15','Start')
INSERT INTO @Events VALUES ('12:00','Stop')
INSERT INTO @Events VALUES ('12:30','Stop')

SELECT
    dt.StartTime, dt.StopTime
    FROM (SELECT
              p.EventTime AS StartTime,CASE WHEN c.EventType!='Stop' THEN NULL ELSE c.EventTime END AS StopTime
                  ,p.EventTime AS SortBy
              FROM @Events          p
                INNER JOIN @Events  c ON p.EventTime<c.EventTime
              WHERE p.EventType='Start'
                  AND c.EventTime=(SELECT MIN(EventTime) FROM @Events WHERE  EventTime>p.EventTime)
          UNION
          SELECT
              NULL AS StartTime,p.EventTime
                  ,p.EventTime AS SortBy
              FROM @Events          p
                INNER JOIN @Events  c ON p.EventTime>c.EventTime
              WHERE p.EventType='STOP'
                  AND c.EventTime=(SELECT MAX(EventTime) FROM @Events WHERE  EventTime<p.EventTime)
                  AND c.EventType='Stop'
         ) dt
    ORDER BY dt.SortBy

输出:

StartTime StopTime
--------- --------
08:00     09:00
10:30     10:45
11:00     NULL
11:15     12:00
NULL      12:30

(5 row(s) affected)

关于sql - 时间序列数据的自连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2186392/

相关文章:

sql - 如何使用数据列表从查询中加入数据?

mysql - 如果另一个表中存在条件,则拒绝选择行

mysql - 一个麻烦的 MySQL Join 操作

sql - 使用两个表而不是具有 2 个不同值的列的优点

sql - 选择多个表

php - 当我在 mysql 中有同一个用户的两个条目时显示重复数据

php - codeigniter 从同一张表中选择加入两次

mysql - 关于优化多个联接的方法的建议。使用数据库触发器使用另一个表来编译数据是不好的做法吗?

java - java程序中的sql查询错误

c# - 用于 Sql 查询的 NHibernate 查询