我有一张这样的桌子:
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)
我应该为此写什么查询?
答案 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;