【问题标题】:Find Combinations of Values in a Single Column - Postgresql在单个列中查找值的组合 - Postgresql
【发布时间】:2017-04-05 05:42:37
【问题描述】:

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

输入:

Col1 | Col2 | Col3


O1 | P1 | 100
O1 | P2 | 200
O1 | P3 | 300
氧气 | P1 | 100
氧气 | P2 | 200

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

预期输出:

Col1 | Col2 | COl3


O1 | P1,P2 | 300

O1 | P2,P3 | 500

O1 | P3,P1 | 400

O1 | P1,P2,P3 |600

氧气 | P1,P2 | 300

在如何解决这个问题以及从哪里开始方面需要一些帮助。

【问题讨论】:

  • 伙计,我得到了你的答案,然后你完全改变了问题。 :( 对于以前的版本,string_agg 将是一个简单的解决方案。看看postgresql.org/docs/devel/static/functions-aggregate.html
  • 课堂作业? (如果是就好了,如果是就说吧。)
  • 哈哈.. 这不是课堂作业哈哈。我在这里重现了销售中的一个业务问题。
  • 谢谢@opatut
  • 对于相同的 COL1 是否存在最大数量的不同值(例如 P4、P5、...)?

标签: postgresql


【解决方案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

【讨论】:

猜你喜欢
  • 2019-02-11
  • 2013-01-25
  • 2021-11-05
  • 2017-04-04
  • 1970-01-01
  • 2011-11-09
  • 2013-07-14
  • 2020-03-11
  • 2015-08-11
相关资源
最近更新 更多