这是SQL数据库的数据:
logs
| user_id | created_at
------------------------------------------
| 123 | 2023-06-09 01:14:41.034482 |
| 123 | 2023-06-09 01:14:25.576612 |
| 123 | 2023-06-08 19:29:29.035590 |
| 123 | 2023-06-07 18:56:58.093392 |
| 123 | 2023-06-07 18:50:52.096982 |
| 123 | 2023-06-07 16:09:23.021376 |
| 123 | 2023-06-06 15:51:08.487921 |
| 123 | 2023-06-06 15:48:57.417946 |
| 555 | 2023-06-03 15:43:57.417946 |
| 555 | 2023-06-02 15:28:57.417946 |
| 555 | 2023-06-01 15:18:57.417946 |
我正在尝试获取user1到今天为止连续登录的天数。
我想要的输出:
user_id | streak
------------------------------------------
123 | 4
我试着用这段代码,但我不知道如何将日期与同一天合并。
SELECT user_id, created_at,
ROW_NUMBER() OVER (ORDER BY created_at) as RN
from logs WHERE user_id=123
2条答案
按热度按时间wydwbb8l1#
SQLFiddle的SqlLite选项有缺陷,所以这是在Postgres中。应该都是一样的,除了你必须在SqlLite中使用日期添加来在postgres中找到DATE - INTEGER_IN_DAYS的等价物,在start_of_streak派生中。
SQLite equivalent of SQL Server DateAdd function
信用到https://blog.jooq.org/how-to-find-the-longest-consecutive-series-of-events-in-sql/以供参考
| 用户id|最长条纹|
| - -----|- -----|
| 一百二十三|4|
| 五五五|3|
小提琴:
http://sqlfiddle.com/#!17/c068c8/7
fkvaft9z2#
这可以通过使用窗口方法
lag()
来获得前一行,然后确定是否存在连续行来完成:Demo here