如何查询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
目前在 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 |