2013-01-19 23 views
1

我有一個所謂的「事件」表中的SQLite數據庫行/使用SQLite/PHP列兩個數字的差異,它具有以下結構:我們兩個不同

rowid  ID     startTimestamp endTimestamp 
1   00:50:c2:63:10:1a 1000    1010 
2   00:50:c2:63:10:1a 1100    1030 
3   00:50:c2:63:10:1a 1090    1110 
4   00:50:c2:63:10:1a 1210    1310 
. 
. 
. 

這是沒有問題的計算startTimestamp和endTimestamp之間的平均時間:

SELECT ID, avg(endTimestamp - startTimestamp) AS duration FROM events WHERE senderID ="00:50:c2:63:10:1a" 

但現在我想有結束時間和一行的開始時間和下一行之間的平均差異,這意味着我的例子:

1100年至1010年= 90

1090至30年= 60

1210至1110年= 100


的薩姆差異= 90 + 60 + 100 = 250

平均差異= 250/3 = 83,33

有沒有辦法用SQL查詢做到這一點?或者是否有必要在PHP中編寫一段代碼?

+0

如何能在'endTime'是'startTime'之前(因爲它是在'rowid = 2')? –

+0

@ypercube在第一印象我以爲它會想要去60分鐘..但不是真的在這裏的情況..當'endtime'在'starttime'之前我juset使用'ABS' ..;) – bonCodigo

回答

1
SELECT 
    id, 
    (MAX(endtimestamp) - MIN(startTimestamp) 
    - SUM(endtimestamp-startTimestamp) 
    )/(COUNT(*)-1) AS averageDifference 
FROM 
    events 
GROUP BY 
    id ; 

在SQL-Fiddle測試:test-1(感謝@bonCodigo)


由於MIN(endtimestamp)未必是一個具有最低rowid,上述查詢需要校正

SELECT 
    id, 
    ((SELECT endtimestamp FROM events AS ee 
     WHERE ee.id = e.id ORDER BY rowid ASC LIMIT 1) 
    - (SELECT startTimestamp FROM events AS ee 
     WHERE ee.id = e.id ORDER BY rowid DESC LIMIT 1) 
    - SUM(endtimestamp-startTimestamp) 
    )/(COUNT(*)-1) AS averageDifference 
FROM 
    events AS e 
GROUP BY 
    id ; 
+0

謝謝,這工作大!是否有可能計算由ID分組的平均差異的方差或標準差? –

+0

你的意思是,如果你有3個平均差異83.3,90和120的ID,計算這3個值的標準差? –

+0

@ypercube'+ 1'獲得OP的請求權:)這與我的查詢有什麼不同?以MIN,MAX?雖然我的小提琴看起來一樣;) – bonCodigo

0

試試這個:

SELECT id,(SUM(duration)/COUNT(*)) duration 
FROM (SELECT ID, (endTimestamp - startTimestamp) AS duration 
     FROM events WHERE senderID ="00:50:c2:63:10:1a") 
0

試試這個:不知道,如果你想使用abs但相應調整。在我的示例中,我只使用了你的前幾行。但是,如果你想使用不同的數據,那麼你可能正確id值添加到where condition:在樣品臺

SQLFIDDLE DEMO

select id, 
sum(abs(endtimestamp - starttimestamp))/Count(*) 
as span from table1 
where id = '00:50:c2:63:10:1a' 
group by id 
; 

結果所有ID:

|    ID | SPAN | 
---------------------------- 
| 00:50:c2:63:10:1a | 50 | 
| 00:50:c2:63:10:2a | 100 | 
相關問題