用SQL计算:每个用户 余额 >= 1000的 最长连续天数,譬如uid_1 余额大于等于1000最长连续天数是2,uid_2 是3; 用户余额表:user_amt(每个用户,每天都有一条记录,不管余额是否为0)
时间: 2024-03-05 11:53:35 浏览: 258
可以使用以下SQL语句来计算每个用户余额大于等于1000的最长连续天数:
```
WITH
cte AS (
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY uid ORDER BY date) AS rn
FROM user_amt
WHERE amt >= 1000
)
SELECT
uid,
MAX(rn - ROW_NUMBER() OVER (PARTITION BY uid, grp ORDER BY date)) AS max_consecutive_days
FROM cte
GROUP BY uid, grp
```
该语句使用了常表达式(CTE)和窗口函数来实现。首先,使用CTE找到每个用户余额大于等于1000的记录,并为它们分配一个序号。接着,使用窗口函数计算每个记录所在的连续区域(使用rn减去组内的行号)。最后,按照用户和连续区域进行分组,并找到每个分组的最大连续天数。
相关问题
用SQL计算:每个用户余额>=1000的最长连续天数,譬如uid1余额大于等于1000最长连续天数是2,uid2是3; 用户余额表:useramt(每个用户,每天都有一条记录,不管余额是否为0) 用户标识 dt 金额 用户界面1 20200501 1000 uid_1 20200502 0 uid_1 20200503 1000 uid_1 20200504 1000 uid_1 20200505 0 uid_2 20200501 1000 uid_2 20200502 2000 uid_2 20200503 1000 uid_2 20200504 900 uid 2 20200505 1000
可以使用 MySQL 的变量和子查询来实现。
首先,需要按照用户分组,按照日期升序排序,并且使用变量 `@consecutive_days` 记录当前连续天数。然后,对于每个用户,使用子查询计算最长连续天数。
具体实现如下:
```sql
SELECT
user_id,
MAX(consecutive_days) AS max_consecutive_days
FROM (
SELECT
user_id,
dt,
@consecutive_days := IF(amt >= 1000, @consecutive_days + 1, 0) AS consecutive_days
FROM
useramt,
(SELECT @consecutive_days := 0) AS t
ORDER BY
user_id, dt
) AS t
WHERE
amt >= 1000
GROUP BY
user_id;
```
解释一下:
外层查询使用 `GROUP BY` 将结果按照用户分组,然后对于每个用户,计算最长连续天数。
内层查询使用变量 `@consecutive_days` 记录当前连续天数,如果余额大于等于 1000,则当前连续天数加 1,否则重置为 0。
最后,根据余额大于等于 1000 条件过滤结果,并按照用户分组,并按照连续天数取最大值。
select u_i.uid as uid, count(distinct act_month) as act_month_total, count(distinct case when year(act_time) = 2021 then act_day end) as act_days_2021, count(distinct case when year(act_time) = 2021 and tag = 'exam' then act_day end) as act_days_2021_exam, count(distinct case when year(act_time) = 2021 and tag = 'question' then act_day end) as act_days_2021_question from user_info u_i left join (select uid, start_time as act_time, date_format(start_time, '%Y%m') as act_month, date_format(start_time, '%Y%m%d') as act_day, 'exam' as tag from exam_record union all select uid, submit_time as act_time, date_format(submit_time, '%Y%m') as act_month, date_format(submit_time, '%Y%m%d') as act_day, 'question' as tag from practice_record ) exam_and_practice on exam_and_practice.uid = u_i.uid where u_i.level >= 6 group by uid order by act_month_total desc, act_days_2021 desc
这是一条 SQL 查询语句,用于查询用户的活跃度。具体来说,它会统计用户在不同时间段内参加考试或练习的次数,并按照总活跃度和2021年活跃度排序。其中,act_month_total 表示用户参加考试或练习的活跃月份数,act_days_2021 表示用户在2021年参加考试或练习的天数,act_days_2021_exam 和 act_days_2021_question 分别表示用户在2021年参加考试或练习、且标记为“exam”或“question”的天数。该语句使用了左连接和子查询等高级语法,适用于较大规模的数据查询。
阅读全文