我正在尝试使用 SQL 查找列中所有唯一可能的值组合。
我有一个表,单列中最多包含 5 个值:类似于:
a,
b,
c,
d,
e
我需要有关 SQL Server 代码的帮助,以仅查找值的唯一组合:
ab, ac, ad, ae, bc, bd, be, cd, ce, de, abc, acd, ade...
目前我正在使用下面的代码来查找 1,2 值组合。表名称为
my_table
,包含值的列为 non_unique_column
。
select
RANK() OVER (PARTITION BY '' ORDER BY concat(col1,col2,col3)) [index]
,* into final_comb_out
from (select
non_unique_column col1, NULL as col2,NULL AS COL3 FROM my_table
UNION ALL
SELECT DISTINCT LEAST(t1.non_unique_column, t2.non_unique_column) AS value1,
GREATEST(t1.non_unique_column, t2.non_unique_column) AS value2
,NULL AS value3
FROM my_table t1
CROSS JOIN my_table t2
WHERE t1.non_unique_column <> t2.non_unique_column
此代码的问题是客户端系统不支持 LEAST 和 GREATEST 函数,因此无法包含该函数。
我非常感谢能够帮助我的代码。谢谢。
您可以使用递归:
WITH RecursiveCombination AS (
SELECT
CAST(non_unique_column AS VARCHAR(255)) AS combination,
non_unique_column AS last_char
FROM my_table
UNION ALL
SELECT
CAST(rc.combination + mt.non_unique_column AS VARCHAR(255)) AS combination,
mt.non_unique_column AS last_char
FROM my_table mt
JOIN RecursiveCombination rc ON mt.non_unique_column > rc.last_char
)
SELECT combination
FROM (
SELECT DISTINCT combination, LEN(combination) as len_comb
FROM RecursiveCombination
WHERE LEN(combination) > 1
) t
ORDER BY t.len_comb, t.combination;
输出:
组合 |
---|
ab |
ac |
广告 |
ae |
BC |
BD |
是 |
cd |
ce |
德 |
abc |
abd |
阿部 |
acd |
王牌 |
阿德 |
bcd |
公元前 |
bde |
cde |
abcd |
abce |
阿卜德 |
阿德 |
bcde |
abcde |
在这里尝试一下。