我有一个带有名为“events”的表的 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写一段代码?
最佳答案
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 ;
关于php - 使用 sqlite/php 获取两个不同行/列中两个数字的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14418104/