【问题标题】:Running total of every increment每个增量的运行总计
【发布时间】:2020-11-10 16:11:30
【问题描述】:

我有一张表events如下:

f_id   leg   
1       1
2       1
3       1
4       2
5       2
6       3
7       1
8       1
9       2

我想要每次leg 更改时的总和。预期输出:

f_id   leg     total_legs   
1       1         1
2       1         1
3       1         1
4       2         2
5       2         2
6       3         3
7       1         4
8       1         4
9       2         5

不知道该怎么做。

SELECT *, @leg_var:=IF(@current_leg=leg, leg) as total_legs FROM `events`

这显然是错误的。

【问题讨论】:

  • 你用的是什么版本的 MySQL?
  • 使用 MariaDB 10.2

标签: mysql sql gaps-and-islands mariadb-10.2


【解决方案1】:
WITH cte AS ( SELECT *, CASE WHEN LAG(leg) OVER (ORDER BY f_id) = leg 
                             THEN 0 
                             ELSE 1 
                             END lag_leg
              FROM test )
SELECT f_id, leg, SUM(lag_leg) OVER (ORDER BY f_id) total_legs
FROM cte;

fiddle

【讨论】:

    【解决方案2】:

    这是一种孤岛问题。在 MySQL 8.0 中,您可以使用lag() 和累积的sum()

    select fid, leg, sum(not leg <=> lag_leg) over(order by f_id) total_legs
    from (
        select e.*, lag(leg) over(order by f_id) lag_leg
        from events e
    ) e
    

    【讨论】:

      【解决方案3】:

      这个问题可以不用窗口函数使用变量来解决:

      SET @leg_var:=null;
      SET @total:=0;
      SELECT 
          f_id, 
          @leg_var prev_leg, 
          @total:=@total+if(@leg_var is null or @leg_var<>leg, 1, 0) as total,
          @leg_var:=leg as leg
      FROM events
      ORDER BY f_id;
      

      fiddle here

      【讨论】:

        猜你喜欢
        • 2018-01-12
        • 2016-11-16
        • 1970-01-01
        • 1970-01-01
        • 2020-05-13
        • 1970-01-01
        • 2021-02-10
        • 1970-01-01
        • 2019-06-02
        相关资源
        最近更新 更多