我不确定这是否可以完成,但如果可以:
假设我有一个简单的表,其中有一个时间字段(为简单起见,我们将只使用整数)和一个 Activity 字段。数据可以按时排序。例如:
| time | activity
--------------------
| 1 | sitting
| 3 | sitting
| 5 | sitting
| 9 | running
| 10 | running
| 11 | sitting
| 13 | sitting
| 15 | walking
| 18 | walking
| 20 | running
| 31 | sitting
| 32 | sitting
是否有一种简单的方法来获取每项 Activity 的开始/停止时间列表?因此我的结果是:
sitting (1, 5)
sitting (9, 10)
sitting (11, 13)
running (9, 10)
running (20, 20)
walking (15, 18)
我知道我可以进行贪婪搜索,并为每个 Activity 收集每个唯一集群的开始/停止时间并以这种方式存储它们。但是由于这些数据存储在一个 sqlite 文件中,我想我可以编写一个查询来快速为我提供我正在寻找的相同数据。数据不必采用我在下面列出的确切格式,而是为我提供所有类似 Activity 的所有开始/停止时间......
最佳答案
SQL 是一种面向集合的语言,因此查询在工作时并不漂亮:
SELECT activity,
time AS start_time,
(SELECT MAX(a3.time)
FROM activity AS a3
WHERE a3.time < ifnull((SELECT MIN(time)
FROM activity AS a4
WHERE a4.time > a1.time
AND a4.activity != a1.activity),
'inf')
) AS end_time
FROM activity AS a1
WHERE (SELECT a2.activity
FROM activity AS a2
WHERE a2.time < a1.time
ORDER BY a2.time DESC
LIMIT 1
) IS NOT a1.activity
工作原理:
外部查询 (a1
) 为组的每个开始返回一条记录。
如果记录是具有 Activity 的第一个记录,即如果前一个记录具有不同的 Activity ,则该记录是组的开始。
前一条记录是时间最长的记录,时间更小,由a2
子查询计算。
比较使用 IS NOT
而不是 !=
因为如果没有以前的记录,子查询将返回 NULL
。
第三列由 a3
子查询计算得出,给出了组的结束时间。
该组的最后一条记录是下一组第一条记录之前的最后一条记录。
下一组的第一条记录(由 a4
子查询计算)是具有最小时间戳的记录,它仍然较大但具有不同的 Activity 。
在 table 的最后,没有下一组; ifnull
将 NULL
转换为字符串 'inf'
,它比任何数字都大。
关于java - 如何获取sqlite表中数据组的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15308362/