Ada*_*dam 6 sql postgresql combinations
输入是'n'长度的数组.我需要生成所有可能的数组元素组合,包括输入数组中元素较少的所有组合.
IN: j='{A, B, C ..}'
OUT: k='{A, AB, AC, ABC, ACB, B, BA, BC, BAC, BCA..}'
Run Code Online (Sandbox Code Playgroud)
随着重复,所以AB BA...
我尝试过这样的事情:
WITH RECURSIVE t(i) AS (SELECT * FROM unnest('{A,B,C}'::text[]))
,cte AS (
SELECT i AS combo, i, 1 AS ct
FROM t
UNION ALL
SELECT cte.combo || t.i, t.i, ct + 1
FROM cte
JOIN t ON t.i > cte.i
)
SELECT ARRAY(SELECT combo FROM cte ORDER BY ct, combo ) AS result;
Run Code Online (Sandbox Code Playgroud)
它产生的组合没有重复......所以我需要以某种方式修改它.
在递归查询中,迭代中使用的搜索表中的术语将被删除,然后对剩余记录重复查询。在您的情况下,这意味着一旦您处理了第一个数组元素(“A”),它就不再可用于数组元素的进一步排列。要重新获取那些“使用过的”元素,您需要与递归查询中的数组元素表交叉连接,然后过滤掉当前排列中已使用的数组元素 ( position(t.i in cte.combo) = 0) 和停止迭代的条件 ( ct <= 3)。
WITH RECURSIVE t(i) AS (
SELECT * FROM unnest('{A,B,C}'::char[])
), cte AS (
SELECT i AS combo, i, 1 AS ct
FROM t
UNION ALL
SELECT cte.combo || t.i, t.i, ct + 1
FROM cte, t
WHERE ct <= 3
AND position(t.i in cte.combo) = 0
)
SELECT ARRAY(SELECT combo FROM cte ORDER BY ct, combo) AS result;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2876 次 |
| 最近记录: |