题解 | 连续签到领金币

连续签到领金币

https://www.nowcoder.com/practice/aef5adcef574468c82659e8911bb297f

-- 创建临时表
WITH a AS(
    SELECT uid, artical_id, DATE(in_time) dt, sign_in
    FROM tb_user_log
),
b AS(
    SELECT uid, artical_id, dt, sign_in
    FROM a
    WHERE artical_id = 0 AND DATE(dt) BETWEEN '2021-07-07' AND '2021-10-31' AND sign_in = 1
),
c AS (
    SELECT 
        uid,
        dt,
        ROW_NUMBER() OVER(PARTITION BY uid ORDER BY dt) rk
    FROM b
),
d AS(
    SELECT 
    uid,
    dt,
    DATE_SUB(dt,INTERVAL rk DAY) dt_tmp,
    ROW_NUMBER() OVER(PARTITION BY uid, DATE_SUB(dt,INTERVAL rk DAY)  ORDER BY dt) % 7 con_sign
    FROM c
),
e AS(
    SELECT
    uid,
    dt,
    CASE WHEN con_sign = 3 THEN 3
        WHEN con_sign = 0 THEN 7
        ELSE 1 END coin
    FROM d
)
SELECT 
    uid,
    DATE_FORMAT(dt,'%Y%m') month,
    SUM(coin) coin
FROM e
GROUP BY uid, month
ORDER BY month, uid


全部评论

相关推荐

点赞 评论 收藏
分享
03-06 18:20
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务