2009-08-13 171 views
0

有與列的表如下:SQL - 查詢返回的結果

Id : long autoincrement; 
timestamp:long; 
price:long 

時間戳給出的毫秒unix_time。

問:是什麼記錄之間的平均時間差?

+0

Oracle 10g數據庫。 – Siv 2009-08-13 11:56:37

+0

@Marc,你的第二個查詢給出了正確的結果。 感謝一噸。 – Siv 2009-08-13 12:03:49

+0

OK,未刪除我的回答讓您可以給予好評它:-)謝謝! 但要知道亞當的評論這是完全正確的 - 如果ID是連續的,並沒有在其中任何空隙我的查詢纔有效。 – 2009-08-13 12:14:36

回答

1

在SQL Server中,你可以寫類似的東西來獲取信息:

SELECT 
    t1.ID, t2.ID, 
    DATEDIFF(MILLISECOND, t2.PriceTime, test2.PriceTime) 
FROM table t1 
INNER JOIN table t2 ON t2.ID = t1.ID-1 
WHERE t1.ID > (SELECT MIN(ID) FROM table) 

,如果你」再只關心在所有條目的AVG,您可以使用:

SELECT 
    AVG(DATEDIFF(MILLISECOND, t2.PriceTime, test2.PriceTime)) 
FROM table t1 
INNER JOIN table t2 ON t2.ID = t1.ID-1 
WHERE t1.ID > (SELECT MIN(ID) FROM table) 

基本上,你需要加入表本身,並使用「t1.ID = t2.ID-1」項目沒有關聯。 2在一個表中,產品編號1在另一個表中,然後計算兩者之間的時間差。爲了避免訪問項目編號。 0不存在,使用「T1.ID>(SELECT MIN(ID)FROM表)」子句從第二項開始。

馬克

+2

這隻有在Id中沒有空白的情況下才有效。 – 2009-08-13 11:50:55

+0

@亞當:真的 - 好點 – 2009-08-13 11:52:35

+0

好的,所以這意味着它確實有效 - 參見OP的評論 - 因爲它是一個「AUTOINCREMENT」列,所以很可能沒有差距(儘管不能保證是這樣:-) ) – 2009-08-13 12:14:00

0

在猜測:

SELECT AVG(timestamp)

我認爲你需要提供更多的信息,你的問題我們會全力協助。

+0

假設有n條記錄。 問題就像記錄之間的平均時差? 在這裏,棘手的是記錄之間的差異。 凸輪你告訴我什麼樣的信息,你需要更多? – Siv 2009-08-13 11:41:41

0

如果你的意思是每個-其他行之間的差異:

select AVG(x) from (
select a.timestamp - b.timestamp as x 
from table a, table b -- this multiplies a*b) sub 
+0

我只有一個表和多個記錄。需要記錄時間差異。沒有多個表。 – Siv 2009-08-13 11:49:45

+0

當然,但是這將使每個條目與其他條目相關聯,例如,你會得到entry1-enty1,entry1-entry2,entry1-entry3等等 - 平均值不會是在「相鄰」條目之間...... – 2009-08-13 11:50:37

+0

@Siv - 這個查詢只使用一個表 - 但是從中選擇兩次(使用別名a,b) – Dewfy 2009-08-13 12:18:25

0
SELECT AVG(T2.Timestamp - T1.TimeStamp) 
    FROM Table T1 
    JOIN Table T2 ON T2.ID = T1.ID + 1 
+0

我的假設是(你知道從哪裏得到你)是OP對連續記錄之間的平均差異感興趣。 T2.ID不能超出有效ID的範圍,因爲那裏沒有記錄! – n8wrl 2009-08-13 11:51:13

+1

Id列中的任何空白都會導致中斷。 – 2009-08-13 11:51:35

+0

@亞當:哎呀 - 你是對的! – n8wrl 2009-08-13 11:52:49

3

首先想到的是子查詢抓取記錄馬上上一篇:

SELECT timestamp - 
(select top 1 timestamp from Table T1 where T1.Id < Table.Id order by Id desc) 
FROM Table 

然後你就可以走的,平均:

SELECT AVG(delta) 
from (SELECT timestamp - 
    (select top 1 timestamp from Table T1 where T1.Id < Table.Id order by Id desc) as delta 
    FROM Table) T 

有可能需要對第一行的結果進行一些處理,但我還沒有測試過。

+0

您需要將「前1名」部分調整爲與Oracle相同,因爲我已經與Oracle合作過了很長時間。 – 2009-08-13 11:59:22

0

試試這個

Select Avg(E.Timestamp - B.Timestamp) 
    From Table B Join Table E 
     On E.Timestamp = 
      (Select Max(Timestamp) 
      From Table 
      Where Timestamp < R.Timestamp)