SQL-非常复杂的一个

SQL-非常复杂的一个,sql,Sql,我需要对两个表进行查询。第一个具有以下字段: id[pk,int] dt[日期时间] 第二张表: sid[pk,int] sdt[日期时间] 现在,第一个表保存某些操作的开始时间,第二个表保存在第一个操作之后发生的子操作 我需要获得从操作开始到结束的平均时间(即在下一个id开始之前到最后一个sid的平均时间)。为了清楚起见-我需要在下一个“id”发生之前从每个“id”字段到最后一个“sid”字段的平均时间(当然使用“dt”和“sdt”字段)。在SQL Server中: WITH m

我需要对两个表进行查询。第一个具有以下字段:

  • id[pk,int]
  • dt[日期时间]
第二张表:

  • sid[pk,int]
  • sdt[日期时间]
现在,第一个表保存某些操作的开始时间,第二个表保存在第一个操作之后发生的子操作


我需要获得从操作开始到结束的平均时间(即在下一个id开始之前到最后一个sid的平均时间)。为了清楚起见-我需要在下一个“id”发生之前从每个“id”字段到最后一个“sid”字段的平均时间(当然使用“dt”和“sdt”字段)。

SQL Server
中:

WITH    main AS
        (
        SELECT  *,
                ROW_NUMBER() OVER (ORDER BY dt) rn
        FROM    t1
        )
SELECT  AVG(DATEDIFF(d, tc.dt, i.sdt))
FROM    main tc
LEFT JOIN
        main tn
ON      tn.rn = tc.rn + 1
OUTER APPLY
        (
        SELECT  TOP 1 sdt
        FROM    t2 i
        WHERE   sdt >= tc.dt
                AND sdt < COALESCE(tn.dt, (SELECT MAX(sdt FROM t2))
        ORDER BY
                i.sdt DESC
        ) sdt

在SQL Server的

WITH    main AS
        (
        SELECT  *,
                ROW_NUMBER() OVER (ORDER BY dt) rn
        FROM    t1
        )
SELECT  AVG(DATEDIFF(d, tc.dt, i.sdt))
FROM    main tc
LEFT JOIN
        main tn
ON      tn.rn = tc.rn + 1
OUTER APPLY
        (
        SELECT  TOP 1 sdt
        FROM    t2 i
        WHERE   sdt >= tc.dt
                AND sdt < COALESCE(tn.dt, (SELECT MAX(sdt FROM t2))
        ORDER BY
                i.sdt DESC
        ) sdt

我的SQL有点生疏,但我认为以下是正确的想法(至少在逻辑上是这样,即使我在语法上有点偏离)


我的SQL有点生疏,但我认为以下是正确的想法(至少在逻辑上是这样,即使我在语法上有点偏离)


谢谢你,克里斯。我想我解释得不对,“id”和“sid”字段是不同的。这些是表的PK,彼此之间没有任何依赖关系。那么,您如何知道第一个表中的哪个时间与哪个时间相关?谢谢Chris。我想我解释得不对,“id”和“sid”字段是不同的。这些是表的PK,彼此之间没有任何依赖关系。那么您如何知道哪些时间与第一个表中的哪个时间关联?这只是因为您的“第二个表”缺少结束时间戳而变得复杂。这只是因为您的“第二个表”缺少结束时间戳而变得复杂。
select a.id as id, avg(a.time) as avg_time
from 
(select s.sid as id, (s.sdt - f.dt) as time
from firstable as f, secondtable as s
where f.id = s.sid) as a
group by a.id