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 09:24:20 浏览: 78
这段代码是一个SQL查询语句,用于计算用户在活动期间内的签到金币数。代码中使用了两个临时表t1和t2。
t1表根据条件筛选出活动期间内的数据,并使用DISTINCT关键字去重,得到每位用户在每天签到的第几次编号。这个编号记录了用户每天签到的顺序。
t2表在t1的基础上进一步处理,根据用户编号和日期计算出用户当天应该获得的金币数。这里使用了DENSE_RANK函数和CASE语句来确定每天签到应该获得的金币数。
最后,查询结果从t2表中按照用户和日期进行分组,并计算每位用户每个月的总金币数,按照日期和用户进行排序。
请问有什么问题我可以帮您解答吗?
阅读全文