Sql 消除嵌入的时间段
我有一个表,其中包含分为时间段的不同服务的数据,这意味着每一行都有一个开始日期和结束日期。有些服务是相同的 我正在寻找一个解决方案,如何删除相同服务的嵌入期间,即包含在或类似于具有相同服务的另一个期间中的所有期间。在以下示例中,我希望删除rn 2和3,因为它们的周期嵌入在rn 1中: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
下面是查询的大致轮廓。它选择而不是删除,以便您可以查看删除的内容:
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速度更快。