我试图查询一个表,并为另外两个列的成对组合计算列值的运行和。
具体而言,考虑到下表:
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);我想查询一个列,该列计算每个桶/标签对的累积和。
换句话说,我希望能够编写一个查询,该查询选择桶、标签和第三列,这是每个条目与该行标签匹配的“总量”列的累积和。例如,对于上面的示例,第三列应该具有以下值:
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但我不知道怎么用标签把它分开。
任何帮助都是非常感谢的!
发布于 2019-08-10 11:48:27
您需要一个partition by子句:
SELECT t.*,
SUM(amount) OVER (PARTITION BY label
ORDER BY amount
) AS running_total
FROM test t
ORDER BY bucket, amount;虽然ORDER BY amount适用于您的数据,但我认为您可能也需要这个桶:
SELECT t.*,
SUM(amount) OVER (PARTITION BY label
ORDER BY bucket, amount
) AS running_total
FROM test t
ORDER BY bucket, amount;这里是db<>fiddle。请注意,这使用MySQL 8,因为您的创建/插入代码与MySQL兼容。
发布于 2019-08-10 02:52:03
我不知道这有多优雅,也不确定您使用的是哪个SQL引擎。但是,以下是PostgreSQL的解决方案:
SELECT
*,
SUM(amount) OVER (
ORDER BY amount
) AS running_total,
(SELECT SUM (amount) AS bucket_total
FROM test AS inner_test
WHERE inner_test.label = outer_test.label
AND inner_test.amount <= outer_test.amount)
FROM test AS outer_test基本上,它概括了具有相同标签的内部选择的数量,以及与外部选择相同或较小的数量。
编辑:我把这个答案留在这里供参考,但最好的方法是@Gordon的回答。
https://stackoverflow.com/questions/57438862
复制相似问题