Sql 我应该使用联接或子查询来比较同一表中的值吗?

Sql 我应该使用联接或子查询来比较同一表中的值吗?,sql,sql-server,join,subquery,Sql,Sql Server,Join,Subquery,在下面的场景中,我试图比较同一个表中类似数据的日期,但行的类别不同。如何编写SQL查询来实现这一点?使用SQL Server、SSMS 具体来说,我有由产品和最终用户组成的合同细节。每一行都有一个日期。对于每个合同,我想比较产品和最终用户的开始和结束日期。如果分销商开始日期>大于产品结束日期,我想取消某些行 下面是一个示例表: 查看第4行,最终用户的开始日期出现在第1行的结束日期之后。因此,第1行应该从结果中省略。第1行和第2行应与第3行和第4行进行比较,因为它们在同一合同中,并且产品应与最终用

在下面的场景中,我试图比较同一个表中类似数据的日期,但行的类别不同。如何编写SQL查询来实现这一点?使用SQL Server、SSMS

具体来说,我有由产品和最终用户组成的合同细节。每一行都有一个日期。对于每个合同,我想比较产品和最终用户的开始和结束日期。如果分销商开始日期>大于产品结束日期,我想取消某些行

下面是一个示例表:


查看第4行,最终用户的开始日期出现在第1行的结束日期之后。因此,第1行应该从结果中省略。第1行和第2行应与第3行和第4行进行比较,因为它们在同一合同中,并且产品应与最终用户进行比较


请注意,在这个表中有数百个合同、产品和最终用户。重申一下,我只想比较合同号相同的产品和最终用户。

答案可能取决于数据库后端,但是使用索引的连接应该是一种成本非常低的操作,而子查询可能会单独运行并转储到临时表中,以便在父查询中重复使用


最好的测试方法可能是对两者进行基准测试,但请确保在执行此操作时禁用缓存。

如果我理解正确,您只希望产品线与最终用户线重叠。我使用重叠,因为这可能是你真正想要的;但您只是使用开始日期和结束日期的比较

我认为窗口函数可以做到这一点:

select t.*
from (select t.*,
             min(case when t.type = 'EndUser' then t.start end) over (partition by t.contract) as min_user_start
      from t
     ) t
where t.type = 'EndUser' or
      t.enddate < min_user_start;

您好,问题的答案取决于您使用的数据库。请编辑您的问题,以指定您正在使用的DBMS及其版本,并添加适当的标记。您如何知道比较第1行和第4行,比如第2行和第4行?第1行和第2行应与第3行和第4行进行比较,因为它们在同一合同中,和产品应该与最终用户进行比较。但您如何知道第1行和第3行是要比较的产品和最终用户?里面没有任何东西表明这些是一起的,我会改正的。应该是省略的第一排。谢谢。我是一个SQL新手,但我很快就深陷其中。
select t.*
from (select t.*,
             min(case when t.type = 'EndUser' then t.start end) over (partition by t.contract) as min_user_start
      from t
     ) t
where t.type = 'EndUser' or
      t.enddate < min_user_start;