MySQL如何创建一个运行总数

MySQL如何创建一个运行总数,mysql,Mysql,我在表1中有一些数据: order_id | cust_id | order_date | city_id 101 | 1 | 15/03/2018 | 1001 102 | 1 | 15/03/2018 | 1005 103 | 2 | 10/03/2018 | 1001 104 | 4 | 16/02/2018 | 1006 105 |

我在表1中有一些数据:

order_id | cust_id | order_date | city_id
101        |    1    | 15/03/2018 |     1001
102        |    1    | 15/03/2018 |     1005
103        |    2    | 10/03/2018 |     1001
104        |    4    | 16/02/2018 |     1006
105        |    4    | 10/01/2018 |     1250
106        |    4    | 15/03/2018 |     1250
107        |    6    | 16/02/2018 |     1058
108        |    6    | 10/03/2018 |     1058
109        |    4    | 23/02/2018 |     1006
110        |    7    | 19/01/2018 |     1005
111        |    7    | 21/01/2018 |     1005
...
我在表2中有这些数据

city_id | city_name
  1001  |   New York
  1005  |  London
  1006  |  Brighton
  1250  |  Toronto
  1058  | Manchester
我需要找到过去10周伦敦的每周订单数量,以及累计总数

这只是我正在处理的数据的一个子集

到目前为止,我已经尝试过:

set @running_total:=0;
select week(a.order_date) as week_start,
    count(a.order_id) as order_count,
    (
        @running_total := @running_total + count(a.order_id)
        ) as cuml_count
from table_1 a
    left join table_2 b on a.city_id = b.city_id
    join (SELECT @running_total := 0) r
where b.city_name = "London"
group by 1
;
但是得到的累积计数与顺序计数相匹配。在我处理的数据上,它看起来像:

week_start | order_count | cuml_count
     2     |      1      |      1
     3     |      1      |      1
     10    |      1      |      1
它应该是这样的:

week_start | order_count | cuml_count
         2     |      1      |      1
         3     |      1      |      2
         10    |      1      |      3

有关详细信息,请参阅此SO帖子

但有点像:

SET @running_total:=0;
SELECT 
    week_start, 
    order_count,
    (@running_total := @running_total + order_count) AS cuml_count
FROM (
    SELECT week(t1.order_date) as week_start,
    COUNT(t1.order_date) AS order_count
    FROM table_1 AS t1
        LEFT JOIN
            table_2 AS t2 
            ON t1.city_id = t2.city_id
    WHERE t2.city_name = "London"
    GROUP BY week_start
) AS temp
ORDER BY week_start
可能对你有用

编辑: 为OP创建了一个,并添加了ORDER BY


编辑:移动到@草莓的订单位置,选择中的初始化也非常好

有关详细信息,请参见本SO帖子

但有点像:

SET @running_total:=0;
SELECT 
    week_start, 
    order_count,
    (@running_total := @running_total + order_count) AS cuml_count
FROM (
    SELECT week(t1.order_date) as week_start,
    COUNT(t1.order_date) AS order_count
    FROM table_1 AS t1
        LEFT JOIN
            table_2 AS t2 
            ON t1.city_id = t2.city_id
    WHERE t2.city_name = "London"
    GROUP BY week_start
) AS temp
ORDER BY week_start
可能对你有用

编辑: 为OP创建了一个,并添加了ORDER BY



编辑:移动到@草莓的订单位置,选择中的初始化也非常好

请看:我已经编辑了数据,所以我的代码现在可以复制了。我看不到。这很奇怪也很有趣,这是20多年来我第一次看到有人使用数字作为别名。现在,我将测试它,并将其与列数一起使用,以便查看发生了什么!像
从表1中按顺序选择1.a,1.b
…请看:我已经编辑了数据,所以我的代码现在可以复制了。这很奇怪也很有趣,这是20多年来我第一次看到有人使用数字作为别名。现在,我将测试它,并将其与列数一起使用,以便查看发生了什么!像
从某个表中按1的顺序选择1.a,1.b,
…我无法想象为什么在这样的查询中会出现外部联接。我只是想指出,这可能是一个重复的问题。但是这里的格式比评论中的格式好一点。幸运的是,链接页面上被接受的答案是有缺陷的。恐怕是这样的。这个答案会使错误永久存在。@jceg316如果这个方法有效,那么它是靠运气而不是设计来实现的。变量秩总是需要ORDERBY子句。它仍然不正确。这里有一个查询链接。我不能说它是否正确,但它至少是有效的:我无法想象为什么外部连接会出现在这样一个查询中。我只是想指出,这可能是一个重复的问题。但是这里的格式比评论中的格式好一点。幸运的是,链接页面上被接受的答案是有缺陷的。恐怕是这样的。这个答案会使错误永久存在。@jceg316如果这个方法有效,那么它是靠运气而不是设计来实现的。变量秩总是需要ORDERBY子句。它仍然不正确。这里有一个查询链接。我不能说它是否正确,但它至少是有效的: