Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 消除嵌入的时间段_Sql_Sql Server_Tsql_Date - Fatal编程技术网

Sql 消除嵌入的时间段

Sql 消除嵌入的时间段,sql,sql-server,tsql,date,Sql,Sql Server,Tsql,Date,我有一个表,其中包含分为时间段的不同服务的数据,这意味着每一行都有一个开始日期和结束日期。有些服务是相同的 我正在寻找一个解决方案,如何删除相同服务的嵌入期间,即包含在或类似于具有相同服务的另一个期间中的所有期间。在以下示例中,我希望删除rn 2和3,因为它们的周期嵌入在rn 1中: 下面是查询的大致轮廓。它选择而不是删除,以便您可以查看删除的内容: SELECT * FROM testdata todelete WHERE EXISTS ( SELECT 1 FROM test

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

我正在寻找一个解决方案,如何删除相同服务的嵌入期间,即包含在或类似于具有相同服务的另一个期间中的所有期间。在以下示例中,我希望删除rn 2和3,因为它们的周期嵌入在rn 1中:


下面是查询的大致轮廓。它选择而不是删除,以便您可以查看删除的内容:

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
        )
)
子查询选择完全包含外部行的行。如果存在开始-结束日期的精确副本,即第1行完全包含第2行,反之亦然,则选择id较高的一行


你能举个例子说明你拥有什么和你想要什么吗?如果两个周期重叠,假设我理解你的问题,你如何决定保留哪一个周期?我总是想保留最长的周期,即包含嵌入周期的周期。如果两个周期完全相同,我会随机选择一个周期,因为它是重复的。因为您在该网站上已经有一段时间了,我不会毫无努力地标记这个问题,但您的问题没有包含足够的细节,我们无法帮助您。请花一点时间阅读这两个链接,然后考虑编辑你的问题,如果你还在寻求帮助。和np。我将在我的问题中添加更多细节,因为它按预期工作。在左连接变体中,我添加了tokeep.rn为NULL的地方,以仅返回第1行。可能会切换表别名的名称以进行澄清。哪个性能更好-子选择还是左连接变体?谢谢。因为目标是删除行,所以我不担心性能。答案使用WHERE EXISTS来选择包含的行。fiddle中的左连接示例用于可视化行如何匹配显示contained/todelete行以及container/tokeep。您可以将别名重命名为任何您喜欢的名称。LEFT JOIN vs EXISTS性能有争议,但据称EXISTS速度更快。