消除嵌入式时间段

时间:2018-09-07 13:18:28

标签: sql sql-server tsql date

我有一个表,其中包含按时间段划分的不同服务的数据,这意味着每一行都有开始日期和结束日期。有些服务是相同的。

我正在寻找有关如何删除同一服务的嵌入期间的解决方案,这意味着包含在具有相同服务的另一个期间中或与之相似的所有期间。在下面的示例中,我要删除rn 2和3,因为它们的周期已嵌入rn 1:

enter image description here

1 个答案:

答案 0 :(得分:0)

这是查询的粗略概述。它选择而不是删除,以便您看到被删除的内容:

SELECT *
FROM testdata todelete
WHERE EXISTS (
    SELECT 1
    FROM testdata tokeep
    WHERE
        todelete.start_date >= tokeep.start_date AND
        todelete.end_date <= tokeep.end_date AND
        todelete.rn <> tokeep.rn AND (
            todelete.start_date > tokeep.start_date OR
            todelete.end_date < tokeep.end_date OR
            todelete.rn > tokeep.rn
        )
)

子查询选择 完全 包含外部行的行。如果存在与开始日期完全相同的副本,即row1完全包含row2,反之亦然,则选择ID较高的那一列。

Variation of the above example using LEFT JOIN to display containing rows