我试图查询一个表,并计算其他两列成对组合的列值的运行和。
具体来说,给出下表:
CREATE TABLE test (
bucket int(10) NOT NULL,
label varchar(10) NOT NULL,
amount int(10) NOT NULL
);
INSERT INTO test VALUES
(1, "A", 1),
(1, "B", 2),
(1, "C", 3),
(2, "A", 4),
(2, "B", 5),
(2, "C", 6),
(3, "A", 7),
(3, "B", 8),
(3, "C", 9),
(4, "A", 10),
(4, "B", 11),
(4, "C", 12);
我想查询一个列,该列计算每个bucket/标签对的累计和。
换句话说,我希望能够编写一个查询来选择bucket、label和第三列,第三列是每个条目的“amount”列的累计和,每个条目的标签与该行的标签匹配。例如,对于上述示例,第三列应具有以下值:
1,
2,
3,
5,
7,
9,
12,
15,
18,
22,
26,
30
换句话说,值5是1和4的和(“a”标签的前两个量),值7是2和5的和(“b”标签的前两个量),等等。
我知道我可以通过如下操作得到整个列的累计和:
SELECT
*,
SUM(amount) OVER (
ORDER BY amount
) AS running_total
FROM test
但我不知道如何按标签来划分。
非常感谢您的帮助!
2条答案
按热度按时间kgsdhlau1#
你想要一个
partition by
条款:尽管
ORDER BY amount
适用于您的数据,我认为您可能真的也需要桶:这是一把小提琴。注意,这使用mysql 8,因为您的create/insert代码与mysql兼容。
jslywgbw2#
我不确定这是多么优雅,也没有指定您正在使用的sql引擎。但这里有一个postgresql的解决方案:
基本上,它汇总了具有相同标签的内部select的数量,以及与外部select相同或更少的数量。
编辑:我将这个答案留作参考,但最好的方法是@gordon linoff的答案。