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