【问题标题】:Create variations of data efficiently有效地创建数据的变体
【发布时间】:2020-10-04 14:06:36
【问题描述】:

我有 4 个参数。我需要创建一个新表,其中包含这 4 个参数的所有可能变体除以它们自己。 这是 4 个参数的示例:
原参数:

 p1  | p2  |  p3 |  p4 |  
=====+=====+=====+=====+
  8  |  8  |  8  |  8  | 

新表应包含:

 p1  | p2  |  p3 |  p4 |  
=====+=====+=====+=====+
  8  |  8  |  8  |  8  | The original raw  
  1  |  8  |  8  |  8  | One cell devided by 8 (4 rows overall)  
  8  |  1  |  8  |  8  |    
  8  |  8  |  1  |  8  |    
  8  |  8  |  8  |  1  |
  1  |  1  |  8  |  8  | Two cells divided by 8 (6 rows overall)  
  1  |  8  |  1  |  8  |    
  1  |  8  |  8  |  1  |    
  8  |  1  |  1  |  8  |    
  8  |  1  |  8  |  1  |           
  8  |  8  |  1  |  1  |           
  1  |  1  |  1  |  8  | Three cells divided by 8 (4 rows overall) 
  1  |  1  |  8  |  1  |    
  1  |  8  |  1  |  1  |    
  8  |  1  |  1  |  1  |    
  1  |  1  |  1  |  1  | All cells divided by 8 (1 row overall)

我正在寻找最有效的方法,因为下一个级别可能是做同样的事情,但有 5 个参数(并进行各种数学运算)。
我想使用 WHILE 循环,但我不知道如何在 c/c++/java/python 等中的 nested for loop 等列上“运行”。还有其他方法吗?创建这个?什么是有效的方法?

【问题讨论】:

  • 高效的是使用基于集合的操作,例如交叉连接到自身。你的参数总是相等的吗?
  • 不,参数不相等。我仅使用简单的参数进行说明。 @Arvo
  • 下次您可能应该提出一个更复杂的示例-从您的示例中我可以创建二进制解决方案-您的 8-s 和 1-s 很好地遵循“显示所有 4 位二进制数”模式: )
  • 您能展示一下您的解决方案吗?对于那个问题,这是一个有趣的想法:) 我正在乞求 SQL,所以欢迎提出想法。 @Arvo
  • 参数行是否在表中?你是什​​么意思“除以8”?如果值不同怎么办?

标签: sql sql-server loops while-loop


【解决方案1】:

根据您的评论,您可以使用apply

select p1.p1, p2.p2, p3.p3, p4.p4
from t cross apply
     (values (t.p1, t.p1 / 8.0)) p1(p1) cross apply
     (values (t.p2, t.p2 / 8.0)) p2(p2) cross apply
     (values (t.p3, t.p3 / 8.0)) p3(p3) cross apply
     (values (t.p4, t.p4 / 8.0)) p4(p4) ;

注意:SQL 查询返回固定数量的列。如果您需要处理可变数量的参数,那么您需要动态 SQL。

也就是说,如何处理您需要的任何特定数量的参数应该是显而易见的。

【讨论】:

    【解决方案2】:

    cross join 解决方案:

    select *
    from
        (values (8),(1)) as q1(p1)
        cross join
        (values (8),(1)) as q2(p2)
        cross join
        (values (8),(1)) as q3(p3)
        cross join
        (values (8),(1)) as q4(p4)
    

    【讨论】:

      猜你喜欢
      • 2018-04-06
      • 1970-01-01
      • 2020-09-14
      • 1970-01-01
      • 2020-06-11
      • 1970-01-01
      • 2017-08-23
      • 2015-10-18
      相关资源
      最近更新 更多