WITH t1 AS( -- t1表筛选出活动期间内的数据,并且为了防止一天有多次签到活动,distinct 去重 SELECT DISTINCT uid, DATE(in_time) dt, DENSE_RANK() over(PARTITION BY uid ORDER BY DATE(in_time)) rn -- 编号 FROM tb_user_log WHERE DATE(in_time) BETWEEN '2021-07-07' AND '2021-10-31' AND artical_id = 0 AND sign_in = 1 ), t2 AS ( SELECT *, DATE_SUB(dt,INTERVAL rn day) dt_tmp, case DENSE_RANK() over(PARTITION BY DATE_SUB(dt,INTERVAL rn day),uid ORDER BY dt )%7 -- 再次编号 WHEN 3 THEN 3 WHEN 0 THEN 7 ELSE 1 END as day_coin -- 用户当天签到时应该获得的金币数 FROM t1 ) SELECT uid,DATE_FORMAT(dt,'%Y%m') `month`, sum(day_coin) coin -- 总金币数 FROM t2 GROUP BY uid,DATE_FORMAT(dt,'%Y%m') ORDER BY DATE_FORMAT(dt,'%Y%m'),uid;
时间: 2024-04-19 19:24:20 浏览: 154
这是一个使用MySQL语言编写的SQL查询语句,用于计算用户在活动期间内的签到金币数。以下是查询语句的解释:
1. 首先,使用子查询t1筛选出在活动期间内的签到数据,并通过DISTINCT关键字去除重复的签到记录。同时,使用DENSE_RANK函数为每个用户的签到记录编上编号。
2. 接下来,使用子查询t2对t1的结果进行处理。在t2中,我们引入了一个临时日期dt_tmp,通过将签到日期dt向前偏移rn天来计算。然后,使用DENSE_RANK函数对每个用户在同一天偏移日期后的签到记录进行编号,并根据编号计算用户当天应获得的金币数day_coin。规则是:如果编号是3,则表示该用户当天是连续签到的第三天,应获得3个金币;如果编号是0,则表示该用户当天是连续签到的第七天,应获得7个金币;其他情况下,用户当天应获得1个金币。
3. 最后,使用主查询从t2中获取每个用户每个月的总金币数,并按照日期和用户ID进行排序。
希望以上解释对你有所帮助!如果还有其他问题,请随时提出。
相关问题
WITH t1 AS( -- t1表筛选出活动期间内的数据,并且为了防止一天有多次签到活动,distinct 去重 SELECT DISTINCT uid, DATE(in_time) dt, DENSE_RANK() over(PARTITION BY uid ORDER BY DATE(in_time)) rn -- 编号 FROM tb_user_log WHERE DATE(in_time) BETWEEN '2021-07-07' AND '2021-10-31' AND artical_id = 0 AND sign_in = 1 ), t2 AS ( SELECT *, DATE_SUB(dt,INTERVAL rn day) dt_tmp, case DENSE_RANK() over(PARTITION BY DATE_SUB(dt,INTERVAL rn day),uid ORDER BY dt )%7 -- 再次编号 WHEN 3 THEN 3 WHEN 0 THEN 7 ELSE 1 END as day_coin -- 用户当天签到时应该获得的金币数 FROM t1 ) SELECT uid,DATE_FORMAT(dt,'%Y%m') `month`, sum(day_coin) coin -- 总金币数 FROM t2 GROUP BY uid,DATE_FORMAT(dt,'%Y%m') ORDER BY DATE_FORMAT(dt,'%Y%m'),uid;
这段代码是一个SQL查询语句,用于计算用户在活动期间内的签到金币数。代码中使用了两个临时表t1和t2。
t1表根据条件筛选出活动期间内的数据,并使用DISTINCT关键字去重,得到每位用户在每天签到的第几次编号。这个编号记录了用户每天签到的顺序。
t2表在t1的基础上进一步处理,根据用户编号和日期计算出用户当天应该获得的金币数。这里使用了DENSE_RANK函数和CASE语句来确定每天签到应该获得的金币数。
最后,查询结果从t2表中按照用户和日期进行分组,并计算每位用户每个月的总金币数,按照日期和用户进行排序。
请问有什么问题我可以帮您解答吗?
阅读全文