【问题标题】:How to query Android Room for current streak and longest Streak如何查询 Android Room 的当前连胜和最长连胜
【发布时间】:2021-03-11 18:51:33
【问题描述】:

目前在 android 房间中有一张桌子,可以在 yyyy-MM-dd 格式的列中保存一天。我想查询最长连续天数和当前连续数。我将如何在 Room 中做到这一点?

这里有一些示例数据可以帮助解释我想要什么:

     action      | date
------------------------------
sample action 1  | 2021-03-01
sample action 2  | 2021-03-02
sample action 3  | 2021-03-03
sample action 4  | 2021-03-04
sample action 5  | 2021-03-05
sample action 6  | 2021-03-06
sample action 7  | 2021-03-09
sample action 8  | 2021-03-09
sample action 9  | 2021-03-10
sample action 10 | 2021-03-11
sample action 11 | 2021-03-12

因此最长的连续是从 2021-03-01 到 2021-03-06 的 6 天,而当前的连续是 4 天(2021-03-09 到 2021-03-12)。

【问题讨论】:

  • 是否需要通过Room查询来实现,还是可以将所有数据读入List并在那里进行分析?
  • @codebod 对我来说理想的解决方案是对每个连胜(当前和最长)进行房间查询,但如果我能做到这一点,另一种方式也可能奏效。
  • 发布示例数据和预期结果以阐明您想要什么。
  • @forpas 我更新了问题以更详细地解释。
  • 我看到有重复的日子:2021-03-09。为什么当前的连胜不是 5?

标签: android sqlite android-sqlite android-room


【解决方案1】:

使用窗口函数 LAG()SUM() 为每个条纹创建 1 个组,然后聚合以计算每个组的行数:

WITH cte AS (
  SELECT SUM(COALESCE(flag, 1)) OVER (ORDER BY date) grp
  FROM (
    SELECT *, DATE(date, '-1 day') <> LAG(date) OVER (ORDER BY date) flag
    FROM (SELECT DISTINCT date FROM tablename)
  )
)  
SELECT MAX(COUNT(*)) OVER () longest_streak, 
       COUNT(*) current_streak 
FROM cte
GROUP BY grp
ORDER BY grp DESC LIMIT 1

请参阅demo
结果:

longest_streak current_streak
6 4

【讨论】:

  • 所以它在我的模拟器上运行良好,但在物理设备上却不行。显然窗口函数和 android 还不是受支持的东西。有没有办法在没有 Windows 功能的情况下实现这一点?
  • @Martin 窗口函数是在 SQLite 版本 3.25.0 (2018-09-15) 中引入的。我猜你想支持版本较低的 Android 版本。我确实尝试过没有窗口函数的更通用的解决方案,但它要复杂得多,性能也要差得多。检查这个:dbfiddle.uk/… 问题是在一个查询中获取两个值。
  • @Martin 或者:dbfiddle.uk/…,如果您的 Android-SQLite 版本支持 CTE。
  • 我能够将查询与 Room 旁边的 Requery 库一起使用。您的答案现在对两者都有效。再次感谢
  • 使用您的查询并尝试找出一种方法来确定从指定日期开始的连续性,如果当天和前一天没有记录任何活动,则该日期将返回 0。运气不好
猜你喜欢
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-22
  • 1970-01-01
  • 2022-12-14
相关资源
最近更新 更多