T-SQL :: 使用 GROUP BY CUBE 生成所有可能的组合
T-SQL :: use GROUP BY CUBE to generate all possible combinations
在一个post中我发现我可以使用GROUP BY CUBE
找到所有可能的组合:
select concat(a,b,c,d)
from (select 'a','b','c','d') as t(a,b,c,d)
group by cube(a,b,c,d)
having len(concat(a,b,c,d)) = 3
代码很漂亮,因为很容易理解。
我想使用相同的代码,但使用 int
而不是 char
。基本上我想找到所有可能的数字组合 (1,2,3,4)。
目标是对它们求和并生成所有可能的总数:
- 1 + 2 + 3 = 6
- 2 + 3 + 4 = 7
- 3 + 4 + 1 = 8
- 等..
我正在尝试解决 T-SQL 中的 knapsack problem,我想看看 GROUP BY CUBE
是否可以作为解决方案
您需要更明确地考虑 NULL
s,但像这样:
select coalesce(a, 0) + coalesce(b, 0) + coalesce(c, 0) + coalesce(d, 0)
from (values (1, 2, 3, 4)) t(a,b,c,d)
group by cube(a,b,c,d)
having (case when a is not null then 1 else 0 end +
case when b is not null then 1 else 0 end +
case when c is not null then 1 else 0 end +
case when d is not null then 1 else 0 end
) = 3;
Here 是一个 db<>fiddle.
我应该注意,执行此操作的另一种方法是使用显式连接:
with t as (
select t.*
from (values (1), (2), (3), (4)) t(x)
)
select t1.x + t2.x + t3.x
from t t1 join
t t2
on t1.x < t2.x join
t t3
on t2.x < t3.x;
如果值可以重复,则这些并不完全相同。但是,您可能会发现 join
版本在处理大量数据时速度更快。
在一个post中我发现我可以使用GROUP BY CUBE
找到所有可能的组合:
select concat(a,b,c,d)
from (select 'a','b','c','d') as t(a,b,c,d)
group by cube(a,b,c,d)
having len(concat(a,b,c,d)) = 3
代码很漂亮,因为很容易理解。
我想使用相同的代码,但使用 int
而不是 char
。基本上我想找到所有可能的数字组合 (1,2,3,4)。
目标是对它们求和并生成所有可能的总数:
- 1 + 2 + 3 = 6
- 2 + 3 + 4 = 7
- 3 + 4 + 1 = 8
- 等..
我正在尝试解决 T-SQL 中的 knapsack problem,我想看看 GROUP BY CUBE
是否可以作为解决方案
您需要更明确地考虑 NULL
s,但像这样:
select coalesce(a, 0) + coalesce(b, 0) + coalesce(c, 0) + coalesce(d, 0)
from (values (1, 2, 3, 4)) t(a,b,c,d)
group by cube(a,b,c,d)
having (case when a is not null then 1 else 0 end +
case when b is not null then 1 else 0 end +
case when c is not null then 1 else 0 end +
case when d is not null then 1 else 0 end
) = 3;
Here 是一个 db<>fiddle.
我应该注意,执行此操作的另一种方法是使用显式连接:
with t as (
select t.*
from (values (1), (2), (3), (4)) t(x)
)
select t1.x + t2.x + t3.x
from t t1 join
t t2
on t1.x < t2.x join
t t3
on t2.x < t3.x;
如果值可以重复,则这些并不完全相同。但是,您可能会发现 join
版本在处理大量数据时速度更快。