【问题标题】:Google sheets query - Cartesian join between two ranges谷歌表格查询 - 两个范围之间的笛卡尔连接
【发布时间】:2018-05-23 10:22:05
【问题描述】:

我们如何使用查询功能在谷歌电子表格上的两个范围之间实现以下连接?

范围 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

【问题讨论】:

标签: google-sheets google-sheets-api google-sheets-query


【解决方案1】:

我们通过query 命令使用的数据可视化语言不支持任何类型的连接。可以使用custom function 获得所需的结果。

它的格式是=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,首先删除匹配的列,使其不会出现两次。

截图:

【讨论】:

  • 谢谢,我会尝试使用自定义函数路由并在完成后投票
  • 这没有给出想要的输出。例如。没有 1000 cc 发动机的情侣,但我在输出中得到了这个 ==> Nissan Coupe 1200 cc Nissan Coupe 1500 cc Nissan Coupe 1000 cc Nissan Coupe 2000 cc Nissan Coupe 1800 cc Nissan Coupe 800 cc Nissan Truck 1200 cc Nissan Truck 1500 cc日产卡车 1000 cc 日产卡车 2000 cc 日产卡车 1800 cc 日产卡车 800 cc
  • 在我的电子表格中工作。我在显示公式及其结果的屏幕截图中进行了编辑。
  • 是的,它有效而且非常高效!除非我能给这 20 票赞!非常感谢
猜你喜欢
  • 2021-04-22
  • 2013-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多