2

テーブルをクエリし、他の 2 つの列のペアごとの組み合わせについて、列の値の実行中の合計を計算しようとしています。

具体的には、次の表を参照してください。

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);

各バケット/ラベルのペアの累積合計を計算する列をクエリしたいと考えています。

別の言い方をすれば、バケット、ラベル、およびその行のラベルと一致するラベルを持つすべてのエントリの「金額」列の累積合計である 3 番目の列を選択するクエリを記述できるようにしたいと考えています。たとえば、上記の例では、3 番目の列に次の値が必要です。

1, 
2, 
3, 
5, 
7, 
9, 
12, 
15, 
18, 
22, 
26, 
30 

つまり、値 5 は 1 と 4 (「A」ラベルの最初の 2 つの量) の合計であり、値 7 は 2 と 5 (「B」ラベルの最初の 2 つの量) の合計です。等

次のようなことを行うことで、列全体の累積合計を取得できることがわかっています。

SELECT
    *,
    SUM(amount) OVER (
        ORDER BY amount
    ) AS running_total
FROM test

しかし、ラベルごとに分割する方法がわかりません。

どんな助けでも大歓迎です!

4

2 に答える 2

2

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<> フィドルがあります。作成/挿入コードは MySQL と互換性があるため、これは MySQL 8 を使用することに注意してください。

于 2019-08-10T11:48:27.383 に答える