Sum until threshold value reached and then reset the counter

后端 未结 2 1950
暖寄归人
暖寄归人 2021-01-16 22:47
user_id | date                 | distance
1       | 2019-04-09 00:00:00  | 2
1       | 2019-04-09 00:00:30  | 5
1       | 2019-04-09 00:01:00  | 3
1       | 2019-04-         


        
2条回答
  •  死守一世寂寞
    2021-01-16 23:27

    As variant you can use RECURSIVE CTE to get it

    Test table:

    CREATE TABLE public.table_b (
        user_id int4 NULL,
        "date" timestamp NULL,
        distance int4 NULL
    );
    
    INSERT INTO public.table_b (user_id,"date",distance) VALUES 
    (1,'2019-04-09 00:00:00.000',2)
    ,(1,'2019-04-09 00:00:30.000',5)
    ,(1,'2019-04-09 00:01:00.000',3)
    ,(1,'2019-04-09 00:01:45.000',7)
    ,(1,'2019-04-09 00:02:30.000',6)
    ,(1,'2019-04-09 00:03:00.000',1)
    ,(2,'2019-04-09 00:00:00.000',2)
    ,(2,'2019-04-09 00:00:30.000',5)
    ,(2,'2019-04-09 00:01:00.000',3)
    ,(2,'2019-04-09 00:01:45.000',7)
    ,(2,'2019-04-09 00:02:30.000',6)
    ,(2,'2019-04-09 00:03:00.000',1);
    

    Query:

    WITH RECURSIVE cte1 AS(
        SELECT *,ROW_NUMBER()OVER(PARTITION BY user_id ORDER BY date) n
        FROM table_b
    ),
    cte2 AS(
        SELECT user_id,date,distance,distance running_distance,n
        FROM cte1
        WHERE n=1
    
        UNION ALL
    
        SELECT c1.user_id,c1.date,c1.distance,CASE WHEN c2.running_distance<10 THEN c2.running_distance ELSE 0 END+c1.distance running_distance,c1.n
        FROM cte1 c1
        JOIN cte2 c2 ON c2.user_id=c1.user_id AND c2.n+1=c1.n
    )
    SELECT user_id,date,distance,running_distance
    FROM cte2
    ORDER BY user_id,date
    

提交回复
热议问题