1

「イベント」と呼ばれるテーブルを持つ SQLite データベースがあり、次の構造を持っています。

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"

しかし、今では、ある行と次の行の間の endTime と startTime の平均差が必要です。つまり、私の例では次のようになります。

1100-1010 = 90

1090-1030 = 60

1210-1110 = 100


差の合計 = 90 + 60 + 100 = 250

平均差 = 250 / 3 = 83,33

SQLクエリでこれを行う方法はありますか? それとも、PHP でコードを書く必要があるのでしょうか?

4

3 に答える 3

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 ;
于 2013-01-19T20:10:22.037 に答える
0

これを試して:

SELECT id,( SUM(duration) / COUNT(*) ) duration
FROM (SELECT ID, (endTimestamp - startTimestamp) AS duration 
      FROM events WHERE senderID ="00:50:c2:63:10:1a")
于 2013-01-19T19:42:18.500 に答える
0

これを試してみてください: 使用するかどうかはわかりませんabsが、それに応じて調整してください。私のサンプルでは、​​最初の数行しか使用していません。しかし、別のデータを使用したい場合は、適切なid値を に追加できますwhere condition:

SQLFIDDLE デモ

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 |
于 2013-01-19T19:51:27.660 に答える