我需要對2個表進行查詢。第一個具有以下字段:SQL - 相當複雜的一個
- ID [PK,INT]
- DT [DATETIME]
第二表:
- SID [PK,INT]
- sdt [datetime]
現在,第一個表保存某個動作的開始時間,第二個表保存第一個動作之後發生的子動作。
我需要從動作開始到結束(即在下一個ID開始之前的最後一個sid)獲得平均時間。要清楚 - 在下一個'id'發生之前(當然使用'dt'和'sdt'字段),我需要從'id'字段到最後'sid'字段的平均時間。
我需要對2個表進行查詢。第一個具有以下字段:SQL - 相當複雜的一個
第二表:
現在,第一個表保存某個動作的開始時間,第二個表保存第一個動作之後發生的子動作。
我需要從動作開始到結束(即在下一個ID開始之前的最後一個sid)獲得平均時間。要清楚 - 在下一個'id'發生之前(當然使用'dt'和'sdt'字段),我需要從'id'字段到最後'sid'字段的平均時間。
在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
如果你有很多的記錄t1
卻少有t2
這一個可能更有效:
SELECT AVG(DATEDIFF(s, dt, msdt))
FROM (
SELECT MAX(sdt) AS msdt, id, dt
FROM t2 i
CROSS APPLY
(
SELECT TOP 1 *
FROM t1
WHERE dt <= sdt
ORDER BY
dt DESC
) t
GROUP BY
id
) q
我的SQL是一個有點生疏,但我我認爲以下是正確的想法(至少在邏輯上,即使我在語法上略有偏離)。
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
謝謝克里斯。我想我沒有解釋正確 - 'id'和'sid'字段是不同的。那些是表中的PK,並且不以任何方式相互依賴。 – Roman 2011-05-05 19:21:59
那麼你怎麼知道哪個時間回到第一個表格的哪個時間? – 2011-05-06 16:24:30
對於什麼數據庫? – 2011-05-05 14:43:14
這只是因爲您的「第二張桌子」缺少結束時間戳而變得複雜。 – Metaphor 2016-09-08 12:35:03