在 SQL 中查找列值的唯一组合

问题描述 投票:0回答:1

我正在尝试使用 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 函数,因此无法包含该函数。

我非常感谢能够帮助我的代码。谢谢。

sql sql-server logic combinations
1个回答
0
投票

您可以使用递归:

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

在这里尝试一下。

© www.soinside.com 2019 - 2024. All rights reserved.