SQL:Select 运行 列 C 的总计,用于其他两列 A 和 B 的成对组合
SQL: Select the Running Total of Column C for pairwise combinations of two other columns A and B
我正在尝试查询 table 并计算其他两个列的成对组合的列值的 运行 总和。
具体来说,给出以下 table:
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/label 对的累积和的列。
换句话说,我希望能够编写一个查询来选择存储桶、标签和第三列,该列是每个条目的 "amount" 列的累计总和,其标签与该行的匹配标签。例如,对于上面的例子,第三列应该有值:
1,
2,
3,
5,
7,
9,
12,
15,
18,
22,
26,
30
也就是说,值5是1和4的和("A"标签的前两个量),值7是2和5的和("A"标签的前两个量) "B" 标签)等
我知道我可以通过执行以下操作来获得整个列的累计和:
SELECT
*,
SUM(amount) OVER (
ORDER BY amount
) AS running_total
FROM test
但我不确定如何按标签拆分它。
非常感谢任何帮助!
我不确定这有多优雅,您也没有指定您使用的 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
基本上,它总结了与外部select具有相同标签和相同或更少数量的内部select的数量。
编辑:我把这个答案留在这里供参考,但更好的方法是@Gordon Linoff 的.
你想要一个 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;
Here 是一个 db<>fiddle。请注意,这使用 MySQL 8,因为您的 create/insert 代码与 MySQL.
兼容
我正在尝试查询 table 并计算其他两个列的成对组合的列值的 运行 总和。
具体来说,给出以下 table:
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/label 对的累积和的列。
换句话说,我希望能够编写一个查询来选择存储桶、标签和第三列,该列是每个条目的 "amount" 列的累计总和,其标签与该行的匹配标签。例如,对于上面的例子,第三列应该有值:
1,
2,
3,
5,
7,
9,
12,
15,
18,
22,
26,
30
也就是说,值5是1和4的和("A"标签的前两个量),值7是2和5的和("A"标签的前两个量) "B" 标签)等
我知道我可以通过执行以下操作来获得整个列的累计和:
SELECT
*,
SUM(amount) OVER (
ORDER BY amount
) AS running_total
FROM test
但我不确定如何按标签拆分它。
非常感谢任何帮助!
我不确定这有多优雅,您也没有指定您使用的 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
基本上,它总结了与外部select具有相同标签和相同或更少数量的内部select的数量。
编辑:我把这个答案留在这里供参考,但更好的方法是@Gordon Linoff 的
你想要一个 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;
Here 是一个 db<>fiddle。请注意,这使用 MySQL 8,因为您的 create/insert 代码与 MySQL.
兼容