java - 如何获取sqlite表中数据组的范围

标签 java android sqlite

我不确定这是否可以完成,但如果可以:

假设我有一个简单的表,其中有一个时间字段(为简单起见,我们将只使用整数)和一个 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 的最后,没有下一组; ifnullNULL 转换为字符串 'inf',它比任何数字都大。

关于java - 如何获取sqlite表中数据组的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15308362/

相关文章:

Java学习使用SWT gridlayout和griddata

java - 如何运行从 Android 源代码获取的应用程序源代码?

Java 和 Windows 区域设置

Android SQLite : nullColumnHack parameter in insert/replace methods

java - 创建数据库时出现 SQLiteException - "android"附近的 SQLiteException

android - 使用 CONFLICT_REPLACE 插入时出现 SQLiteException "cannot commit - no transaction is active"

java - 使用 GlassPane 的 Java 内部透明选择窗口

android - Android 中的统一收件箱是什么?

android - 如何修复 (android.database.CursorWindowAllocationException) 崩溃

android - 与 GooglePlayServicesUtil 的奇怪对话