ZhangZhihui's Blog  

 

CREATE TABLE user_login (
    user_id int,
    login_date date
);


INSERT INTO user_login VALUES 
(1, '2025-12-01'::date), 
(1, '2025-12-01'::date), 
(1, '2025-12-02'::date), 
(1, '2025-12-03'::date), 
(1, '2025-12-04'::date), 
(1, '2025-12-05'::date), 
(1, '2025-12-06'::date), 
(1, '2025-12-07'::date), 
(2, '2025-12-01'::date), 
(2, '2025-12-02'::date), 
(2, '2025-12-03'::date), 
(2, '2025-12-05'::date), 
(2, '2025-12-06'::date), 
(2, '2025-12-07'::date), 
(2, '2025-12-08'::date), 
(3, '2025-12-01'::date), 
(3, '2025-12-02'::date), 
(3, '2025-12-03'::date), 
(3, '2025-12-05'::date), 
(3, '2025-12-06'::date), 
(3, '2025-12-08'::date), 
(4, '2025-12-05'::date);

 

WITH t1 AS (
    SELECT DISTINCT user_id, login_date
      FROM user_login
),
t2 AS (
    -- Calculate a 'group' for consecutive dates
    SELECT user_id,
           login_date,
           ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY login_date) AS rn,
           login_date - ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY login_date) * INTERVAL '1 day' AS grp
      FROM t1
),
t3 AS (
    -- Count consecutive logins within each group
    SELECT user_id,
           login_date,
           ROW_NUMBER() OVER (PARTITION BY user_id, grp ORDER BY login_date) AS consecutive_login_days
      FROM t2
),
t4 AS (
    SELECT user_id,
           login_date,
           CASE
               WHEN consecutive_login_days = 7 THEN 10
               WHEN consecutive_login_days = 6 THEN 6
               WHEN consecutive_login_days = 3 THEN 3
               ELSE 0
           END AS points
      FROM t3 
),
t5 AS (
    SELECT user_id, MAX(points) AS max_points
      FROM t4
    GROUP BY user_id
),
t6 AS (
    SELECT a.user_id, SUM(a.points) AS points
      FROM t4 a, t5 b
     WHERE a.user_id = b.user_id AND a.points = b.max_points
     GROUP BY a.user_id
)
SELECT * FROM t6
ORDER BY user_id;

 

1

 

posted on 2025-12-17 10:34  ZhangZhihuiAAA  阅读(3)  评论(0)    收藏  举报