MYSQL中当前行上日期之前(包括)的所有行的总和

MYSQL中当前行上日期之前(包括)的所有行的总和,mysql,sql,cumulative-sum,Mysql,Sql,Cumulative Sum,知道日期在查询期间是未知的是很重要的,所以我不能硬编码一个WHERE子句 这是我的桌子: +-----------+----------+-------------+ | Date_ID | Customer | Order_Count | +-----------+----------+-------------+ | 20150101 | Jones | 6 | | 20150102 | Jones | 4 | | 20150103

知道日期在查询期间是未知的是很重要的,所以我不能硬编码一个WHERE子句

这是我的桌子:

+-----------+----------+-------------+
| Date_ID   | Customer | Order_Count |
+-----------+----------+-------------+
| 20150101  | Jones    | 6           |
| 20150102  | Jones    | 4           |
| 20150103  | Jones    | 3           |
+-----------+----------+-------------+
以下是所需的输出:

+-----------+----------+------------------+
| Date_ID   | Customer | SUM(Order_Count) |
+-----------+----------+------------------+
| 20150101  | Jones    | 6                |
| 20150102  | Jones    | 10               |
| 20150103  | Jones    | 13               |
+-----------+----------+------------------+
我想我需要使用一个变量或者一个连接


编辑:仍然无法足够快地获取它。非常慢。

一种方法是使用子查询,将所有订单汇总到当前订单。也许不是最快的方法,但它应该可以做到

SELECT `Date_ID`, `Customer`, 
    (SELECT sum(b.`Order_Count`) 
    FROM tablename as b WHERE 
    b.`Date_ID` <= a.`Date_ID` AND
    a.`customer = b.`Customer`) 
FROM tablename as a

试试这个查询;这很可能是在不限制您操作的数据集的情况下所能做的最好的。它应该受益于索引客户date\u id

select 
  t1.date_id, t1.customer, sum(t2.order_count)
from 
  table1 t1
left join 
  table1 t2 on t1.customer = t2.customer
           and t1.date_id >= t2.date_id
group by 
  t1.date_id, t1.customer;

< P>性能是一个问题,考虑一个类似如下的解决方案:

SELECT * FROM ints;
+---+
| i |
+---+
| 0 |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
+---+

SELECT i,@i:=@i+i FROM ints, (SELECT @i:=0)n ORDER BY i;
+---+----------+
| i | @i:=@i+i |
+---+----------+
| 0 |        0 |
| 1 |        1 |
| 2 |        3 |
| 3 |        6 |
| 4 |       10 |
| 5 |       15 |
| 6 |       21 |
| 7 |       28 |
| 8 |       36 |
| 9 |       45 |
+---+----------+

给定您的输入数据,我看不出您希望如何获得所需的输出。您的数据集有多大,表上有哪些索引?对于任何非MySQL的RDBMS,您所需的输出都非常简单,因为不支持窗口函数。看,我有一个很大的数据集,子查询速度非常慢。另外,我认为在您的示例中我需要一个group by子句,因为实际上有不同的客户名称。将客户添加到子查询中,但它确实不是很快,因为它需要重新计算每个元素的完整和。索引应该会有所帮助。如果它仍然太慢,您可能需要考虑在SQL之外计算程序中的和。但到目前为止,无论客户名称如何,这都会对所有ID进行求和…而且group by也不会影响它…每个客户都应该独立求和。我想这就是选择提供具有适当代表性的DDL/SQLFIDLE与否的区别。