【问题标题】:T-SQL :: use GROUP BY CUBE to generate all possible combinationsT-SQL :: 使用 GROUP BY CUBE 生成所有可能的组合
【发布时间】:2020-10-12 13:09:05
【问题描述】:

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 是否可以解决

【问题讨论】:

    标签: sql sql-server tsql cube olap-cube


    【解决方案1】:

    您需要更明确地考虑NULLs,但是像这样:

    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 是一个 dbfiddle。

    我应该注意,这样做的另一种方法是使用显式连接:

    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 版本在处理大量数据时速度更快。

    【讨论】:

    • 有没有办法设置“仅选择低于 8 的值”之类的限制?
    • @FrancescoMantovani。 . .您将添加一个having 子句:coalesce(a, 0) + coalesce(b, 0) + coalesce(c, 0) + coalesce(d, 0) &lt; 8
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    • 2021-01-14
    • 2021-01-14
    • 2014-11-24
    • 2019-04-06
    • 1970-01-01
    相关资源
    最近更新 更多