Нахождение X в sql bigquery - PullRequest
0 голосов
/ 09 июля 2020

У нас есть 6 переменных, определенная комбинация каждой из них должна приближаться к числу. Например:

60 x1 +226 x2 + 400 x3 +554 x4+ 469 x5+ 278 x6 должно быть как можно ближе к заданному числу, скажем, 2620

Ограничения: x1>=x2>=x3>=x4>=x5>=x6 X могут быть только целыми числами и также должны быть> = 1

Ищете легко масштабируемое решение для этого в Google bigquery

1 Ответ

1 голос
/ 09 июля 2020

Ниже приведено для BigQuery Standard 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     

Примечание: вышеупомянутый подход относительно легко может быть принят для динамического c количества переменных параметров

...