2011-05-05 37 views
0

我需要對2個表進行查詢。第一個具有以下字段:SQL - 相當複雜的一個

  • ID [PK,INT]
  • DT [DATETIME]

第二表:

  • SID [PK,INT]
  • sdt [datetime]

現在,第一個表保存某個動作的開始時間,第二個表保存第一個動作之後發生的子動作。

我需要從動作開始到結束(即在下一個ID開始之前的最後一個sid)獲得平均時間。要清楚 - 在下一個'id'發生之前(當然使用'dt'和'sdt'字段),我需要從'id'字段到最後'sid'字段的平均時間。

+0

對於什麼數據庫? – 2011-05-05 14:43:14

+0

這只是因爲您的「第二張桌子」缺少結束時間戳而變得複雜。 – Metaphor 2016-09-08 12:35:03

回答

3

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 
0

我的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 
+0

謝謝克里斯。我想我沒有解釋正確 - 'id'和'sid'字段是不同的。那些是表中的PK,並且不以任何方式相互依賴。 – Roman 2011-05-05 19:21:59

+0

那麼你怎麼知道哪個時間回到第一個表格的哪個時間? – 2011-05-06 16:24:30