gpt4 book ai didi

sql - PostgreSQL 在递归查询中找到所有可能的组合(排列)

转载 作者:行者123 更新时间:2023-11-29 11:25:12 24 4
gpt4 key购买 nike

输入是一个长度为“n”的数组。我需要生成数组元素的所有可能组合,包括输入数组中元素较少的所有组合。

IN: j='{A, B, C ..}'
OUT: k='{A, AB, AC, ABC, ACB, B, BA, BC, BAC, BCA..}'

随着重复,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;

它正在生成没有重复的组合...所以我需要以某种方式修改它。

最佳答案

在递归查询中,迭代中使用的搜索表中的术语被删除,然后查询对剩余的记录重复。在您的情况下,这意味着一旦您处理了第一个数组元素(“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;

关于sql - PostgreSQL 在递归查询中找到所有可能的组合(排列),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30515990/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com