有與列的表如下:SQL - 查詢返回的結果
Id : long autoincrement;
timestamp:long;
price:long
時間戳給出的毫秒unix_time。
問:是什麼記錄之間的平均時間差?
有與列的表如下:SQL - 查詢返回的結果
Id : long autoincrement;
timestamp:long;
price:long
時間戳給出的毫秒unix_time。
問:是什麼記錄之間的平均時間差?
在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表)」子句從第二項開始。
馬克
這隻有在Id中沒有空白的情況下才有效。 – 2009-08-13 11:50:55
@亞當:真的 - 好點 – 2009-08-13 11:52:35
好的,所以這意味着它確實有效 - 參見OP的評論 - 因爲它是一個「AUTOINCREMENT」列,所以很可能沒有差距(儘管不能保證是這樣:-) ) – 2009-08-13 12:14:00
在猜測:
SELECT AVG(timestamp)
我認爲你需要提供更多的信息,你的問題我們會全力協助。
假設有n條記錄。 問題就像記錄之間的平均時差? 在這裏,棘手的是記錄之間的差異。 凸輪你告訴我什麼樣的信息,你需要更多? – Siv 2009-08-13 11:41:41
如果你的意思是每個-其他行之間的差異:
select AVG(x) from (
select a.timestamp - b.timestamp as x
from table a, table b -- this multiplies a*b) sub
首先想到的是子查詢抓取記錄馬上上一篇:
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
有可能需要對第一行的結果進行一些處理,但我還沒有測試過。
您需要將「前1名」部分調整爲與Oracle相同,因爲我已經與Oracle合作過了很長時間。 – 2009-08-13 11:59:22
試試這個
Select Avg(E.Timestamp - B.Timestamp)
From Table B Join Table E
On E.Timestamp =
(Select Max(Timestamp)
From Table
Where Timestamp < R.Timestamp)
Oracle 10g數據庫。 – Siv 2009-08-13 11:56:37
@Marc,你的第二個查詢給出了正確的結果。 感謝一噸。 – Siv 2009-08-13 12:03:49
OK,未刪除我的回答讓您可以給予好評它:-)謝謝! 但要知道亞當的評論這是完全正確的 - 如果ID是連續的,並沒有在其中任何空隙我的查詢纔有效。 – 2009-08-13 12:14:36