Запрос таблиц Google - декартово соединение между двумя диапазонами

Как мы можем добиться следующего соединения двух диапазонов в Google Spreadsheet с помощью функции запроса?

Диапазон 1

Model   Style
Nissan  Coupe
Nissan  Truck
Honda   Sedan
Honda   Hatchback
Toyata  Truck
Honda   Coupe

Диапазон 2

Style       Engine
Coupe       1200 cc
Coupe       1500 cc
Sedan       1000 cc
Truck       2000 cc
Sedan       1800 cc
Hatchback   800 cc

Вывод

Model   Style       Engine
Nissan  Coupe       1200 cc
Nissan  Coupe       1500 cc
Honda   Sedan       1000 cc
Nissan  Truck       2000 cc
Honda   Sedan       1800 cc
Honda   Hatchback   800 cc
Honda   Coupe       1200 cc
Honda   Coupe       1500 cc
Toyata  Truck       2000 cc

person Ashish Dhandharia    schedule 09.12.2017    source источник
comment
Подобно этому Q: stackoverflow.com/questions/42805885/   -  person Max Makhrov    schedule 11.12.2017


Ответы (1)


Язык визуализации данных, который мы используем с помощью команды query, не поддерживает никаких объединений. Желаемый результат можно получить с помощью настраиваемой функции.

Его формат - =cartesianJoin(arr1, arr2, col1, col2), где первые два аргумента - это диапазоны, которые необходимо объединить, а два других - номера столбцов (относительно диапазона), по которым должно быть выполнено объединение. Например, в вашем случае первый массив может быть в A2: B8, а второй - в D2: E8. Тогда формула будет

=cartesianJoin(A2:B8, D2:E8, 2, 1)

указывая, что мы присоединяемся, когда второй столбец первого массива (B) равен первому столбцу второго массива (D).

function cartesianJoin(arr1, arr2, col1, col2) {
  var output = [];
  for (var i = 0; i < arr1.length; i++) {
    var r1 = arr1[i];
    var matching = arr2.filter(function(r2) {
      return r1[col1 - 1] === r2[col2 - 1];
    }).map(function(r2) {
      var copyr2 = r2.slice(0);
      copyr2.splice(col2 - 1, 1);
      return r1.concat(copyr2);
    });
    output = output.concat(matching);
  }
  return output;                     
}

Логика: для каждой строки первого массива (r1) отфильтруйте второй массив по требованию равенства, затем объедините каждую из совпадающих строк с r1, сначала удалив совпадающий столбец, чтобы он не появлялся дважды.

Скриншот:

лист

person Community    schedule 10.12.2017
comment
Спасибо, я попытаюсь использовать маршрут пользовательской функции и проголосую, как только это будет сделано - person Ashish Dhandharia; 10.12.2017
comment
Это не дало желаемого результата. Например, Не существует пары с двигателем объемом 1000 куб. См, но я получил это на выходе == ›Nissan Coupe 1200 куб. Тележка Ниссан 1000 куб.см Тележка Ниссан 2000 куб.см Тележка Ниссан 1800 куб.см Тележка Ниссан 800 куб.см - person Ashish Dhandharia; 11.12.2017
comment
Работает в моей таблице. Я отредактировал снимок экрана, на котором показана формула и ее результат. - person ; 11.12.2017
comment
Да, работает и невероятно эффективно! Только если бы я мог дать эти 20 голосов! Огромное спасибо - person Ashish Dhandharia; 11.12.2017