如何查询Android当前连胜和最长连胜的余地

How to query Android Room for current streak and longest Streak

目前在 android 房间中有一个 table,它以 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)。

使用window 函数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