【问题标题】:Finding X in sql bigquery在 sql bigquery 中查找 X
【发布时间】:2020-07-09 19:26:24
【问题描述】:

我们有 6 个变量,每个变量的特定组合应该最接近一个数字。 例如:

60 x1 +226 x2 + 400 x3 +554 x4+ 469 x5+ 278 x6 应该尽可能接近给定的数字,比如 2620

约束:x1>=x2>=x3>=x4>=x5>=x6 Xs 只能是整数,也应该 >=1

在 Google bigquery 中为此寻找易于扩展的解决方案

【问题讨论】:

  • 你的桌子是什么样子的? BigQuery 有表格和列,而不是变量和数字。
  • Columns X, X_weights , total_value Column X 有 x1,x2,x3,x4,x5 行 X_weights 有 60,226,400,554,469,278 total_value 有 6 行,其中 2620 重复
  • 猜这是某种背包问题

标签: sql google-cloud-platform google-bigquery bin-packing


【解决方案1】:

以下是 BigQuery 标准 SQL

#standardSQL
WITH puzzle AS (
  SELECT 'x1' x, 60 weight, 2620 target UNION ALL
  SELECT 'x2', 226, 2620 UNION ALL
  SELECT 'x3', 400, 2620 UNION ALL
  SELECT 'x4', 554, 2620 UNION ALL
  SELECT 'x5', 469, 2620 UNION ALL
  SELECT 'x6', 278, 2620 
), numbers AS (
  SELECT num FROM (
    SELECT DIV(ANY_VALUE(target), MIN(weight)) max_num
    FROM puzzle
  ), UNNEST(GENERATE_ARRAY(1, max_num)) num
)
SELECT x1.num x1, x2.num x2, x3.num x3, x4.num x4, x5.num x5, x6.num x6,
  (SELECT weight FROM puzzle WHERE x = 'x1') * x1.num + 
  (SELECT weight FROM puzzle WHERE x = 'x2') * x2.num + 
  (SELECT weight FROM puzzle WHERE x = 'x3') * x3.num + 
  (SELECT weight FROM puzzle WHERE x = 'x4') * x4.num + 
  (SELECT weight FROM puzzle WHERE x = 'x5') * x5.num + 
  (SELECT weight FROM puzzle WHERE x = 'x6') * x6.num AS result
FROM puzzle z,
  numbers x1,
  numbers x2,
  numbers x3,
  numbers x4,
  numbers x5,
  numbers x6
WHERE x1.num >= x2.num 
AND x2.num >= x3.num 
AND x3.num >= x4.num 
AND x4.num >= x5.num 
AND x5.num >= x6.num 
ORDER BY ABS(target - result)   
LIMIT 1

输出是

Row x1  x2  x3  x4  x5  x6  result   
1   4   3   1   1   1   1   2619     

注意:对于动态数量的参数变量,上述方法相对容易采用

【讨论】:

猜你喜欢
  • 2020-06-25
  • 1970-01-01
  • 2018-02-22
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
  • 1970-01-01
  • 2019-05-28
  • 1970-01-01
相关资源
最近更新 更多