(SQLITE)SUM基于累积范围

时间:2019-06-24 22:12:07

标签: sql sqlite

我有一张这样的桌子:

id | sales |  profit | place
_____________________|______ 
1  |   2   |    1    |  US
2  |   3   |    -    |  SL
3  |   1   |    1    | India
4  |   0   |    -    |  Aus
5  |   2   |    -    |  -
6  |   4   |    1    |  UK
7  |   1   |    -    |  -

现在我要实现的是,无论在何处profit = 1,我都希望按sales列和相应的id的顺序累积place。 即

   |  cumulativeSales | place  |
   | ________________ |_______ |
   |     2            |  US    |      //(2)
   |     6            | India  |      //(2+3+1)
   |     12           |  UK    |      //(2+3+1+0+2+4)

我应该为此写什么查询?

1 个答案:

答案 0 :(得分:2)

如果使用现代版本的sqlite(3.25或更高版本),则可以使用窗口功能:

SELECT cumulativeSales, place
FROM (SELECT id, place, profit
           , sum(sales) OVER (ORDER BY id) AS cumulativeSales
      FROM yourtable)
WHERE profit = 1
ORDER BY id;

给予

cumulativeSales  place
---------------  ----------
2                US
6                India
12               UK

内部查询中使用的sum()(由下面的OVER子句指示)的窗口函数形式汇总结果行的给定 window 。仅带有ORDER BY(没有明确的框架术语)的默认行为是使用第一行,直到所有具有相同排序值但没有更大值的行。换句话说,它计算累计和。有关更多信息,请参见the documentation

外部查询仅将结果限制在profit为1的那些行中。如果不使用子查询全部执行一次,则只会计算这些行的累加总和,而不是所有行,因为窗口函数是在WHERE过滤完成之后计算出来的。


使用相关子查询来计算运行总计的另一种方法,适用于不支持窗口功能的旧版本:

SELECT (SELECT sum(sales) FROM yourtable AS t2 WHERE t2.id <= t.id) AS cumulativeSales
     , place
FROM yourtable AS t
WHERE profit = 1
ORDER BY id;