sql:为其他两列a和b的成对组合选择列c的运行总数

ycl3bljg  于 2021-06-24  发布在  Hive
关注(0)|答案(2)|浏览(406)

我试图查询一个表,并计算其他两列成对组合的列值的运行和。
具体来说,给出下表:

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

但我不知道如何按标签来划分。
非常感谢您的帮助!

kgsdhlau

kgsdhlau1#

你想要一个 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;

这是一把小提琴。注意,这使用mysql 8,因为您的create/insert代码与mysql兼容。

jslywgbw

jslywgbw2#

我不确定这是多么优雅,也没有指定您正在使用的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的答案。

相关问题