在单列中查找值的组合 - Postgresql

时间:2017-04-05 05:42:37

标签: postgresql

我有一个这种结构的输入表

输入:

Col1 | Col2 | COL3

O1 | P1 | 100个
O1 | P2 | 200个
O1 | P3 | 300个
O2 | P1 | 100个
O2 | P2 | 200

我需要找到不同的组合并同时聚合另一列中的值。

预期输出:

Col1 | Col2 | COL3

O1 | P1,P2 | 300

O1 | P2,P3 | 500

O1 | P3,P1 | 400

O1 | P1,P2,P3 | 600

O2 | P1,P2 | 300

如何解决此问题以及从何处开始需要一些帮助。

1 个答案:

答案 0 :(得分:1)

你可以试试这个(X是你的桌子):

WITH RECURSIVE R  AS (SELECT X.COL1, X.COL2, CAST(X.COL2 AS VARCHAR(100)) AS COMBI, COL3 AS TOT
           FROM X
           UNION ALL
           SELECT X.COL1, X.COL2,  CAST( r.COMBI || CAST(',' AS VARCHAR(1)) || X.COL2  AS VARCHAR(100)), X.COL3+R.TOT AS TOT
            FROM R 
            INNER JOIN X ON X.COL2 > R.COL2 AND X.COL1 = R.COL1)
SELECT COL1, COMBI, TOT 
FROM R
WHERE LENGTH(COMBI) >LENGTH(COL2)
ORDER BY COL1, LENGTH(COMBI), COMBI
;

输出(包含您发布的数据):

    col1    combi   tot
1   O1  P1,P2   300
2   O1  P1,P3   400
3   O1  P2,P3   500
4   O1  P1,P2,P3    600
5   O2  P1,P2   300

输出(在O1中添加另一行P4):

    col1    combi   tot
1   O1  P1,P2   300
2   O1  P1,P3   400
3   O1  P1,P4   500
4   O1  P2,P3   500
5   O1  P2,P4   600
6   O1  P3,P4   700
7   O1  P1,P2,P3    600
8   O1  P1,P2,P4    700
9   O1  P1,P3,P4    800
10  O1  P2,P3,P4    900
11  O1  P1,P2,P3,P4 1000
12  O2  P1,P2   300