【问题标题】:Google spreadsheet "=QUERY" join() equivalent function?Google 电子表格“=QUERY”join() 等效函数?
【发布时间】:2013-01-25 15:19:30
【问题描述】:

这个问题是关于使用 =QUERY 函数在 Google 电子表格中连接两个数据库

我在 A1:C3 范围内有一个这样的表

a d g
b e h
c f i

我还有一张桌子

c j m
a k n
b l o

我希望决赛桌看起来像这样

a d g k n
b e h l o 
c f i j m

我可以很容易地在单元格 D1 中使用 vlookup 函数并将其向下粘贴,但我的数据集非常庞大。我需要一整页的 vlookup,而 Google 电子表格告诉我在复杂性方面已达到极限。

我查看了 Google 的查询语言参考...似乎没有提到一种“加入”函数。你会认为这将是一个简单的“加入 A”类型的操作。

任何人都可以在没有 vlookup 的情况下解决这个问题吗?

【问题讨论】:

  • 我猜indexmatch 的复杂性与vlookups 相同,但你可以试试this implementation。如果这不起作用,那么我认为需要编写自定义函数。
  • @Konstant。谢谢你的建议。您的解决方案也有效。我认为自从新的谷歌表格以来,这个问题变得不那么重要了。据说他们已经消除了复杂性限制的数量,但我仍然注意到更大的工作表存在一些问题。
  • 如果可能的话,你能分享给我一份样本表(包含大量数据)吗?我将尝试为此编写一个自定义函数。
  • 我无法共享数据。我想你用 rand() 函数重新创建它
  • @鲁本。 google 什么时候会重写他们的查询功能?似乎越来越多的人在使用它,是时候让它更强大了!

标签: sql google-sheets google-query-language


【解决方案1】:

简答

Google QUERY Language 0.7 版 (2016) 不包含 JOIN (LEFT JOIN) 运算符,但这可以通过使用数组公式来实现,其结果可用作 QUERY 函数的输入或用于其他用途。

说明

数组公式和array handling features of Google Sheets 可以在两个简单表之间进行连接。为了更易于阅读,建议的公式使用命名范围而不是范围引用。

命名范围

  • table1 : Sheet1!A1:C3
  • table2 : Sheet2!A1:C3
  • ID : Sheet1!A1:A3

公式

=数组公式( { 表格1, vlookup(ID,table2,COLUMN(间接("R1C2:R1C"&COLUMNS(table2),0)),0) } )

备注:

  • 可以使用开放式范围,但这可能会使电子表格变慢。
  • 加快重新计算时间:
  1. Indirect("R1C2:R1C"&COLUMNS(table2),0) 替换为从 2 到 table2 列数的常量数组。
  2. 从电子表格中删除空行

示例

请参阅this sheet 了解示例

注意

2017 年,Google 改进了关于 QUERY 的官方英文帮助文章,QUERY function。它仍然不包括这样的主题,但可能有助于理解它的工作原理。

【讨论】:

  • 目前这是唯一适用于大型数据集的答案,无需在每个单元格中粘贴公式。这真的很有帮助。谢谢!
  • 这很聪明。是否可以将其变成 INNER JOIN?
  • @cjm2671:谢谢。如果您还没有这样做,请发布一个新问题。这可能很明显,但无论如何...如果您在此处添加链接,我将能够轻松找到它:)
  • 迄今为止我得到的最佳答案
  • 谢谢@Rubén,这是金子!您能否通过“...通过从 2 到 table2 的列数的常量数组”来扩展您的意思。我尝试使用 {2,2} 和变体作为 INDIRECT(...) 的替代品,但没有成功
【解决方案2】:

你可以使用ARRAYFORMULA 或者你可以直接拖动这个公式: 在导入或QUERY-ing 第一个表之后;在 D 列中:

=QUERY(Sheet2!A1:C3, "Select B,C WHERE A='" & A1 & "'", 0)

【讨论】:

    【解决方案3】:

    因此,这回答了您如何使用 Vlookup 函数执行此操作,但仅在一个单元格中。
    在您的示例中,假设每个数据表都有以下单元格引用:

    表 1:Sheet1!A1:C3

    a d g
    b e h
    c f i
    

    表 2:Sheet2!A1:C3

    c j m
    a k n
    b l o
    

    这就是公式的构造方式。

    加入公式

    =ArrayFormula(
       {
         Sheet1!A1:C,
         vlookup(Sheet1!A1:A, {Sheet2!A1:A, Sheet2!B1:C}, {2,3}, false)
       }
    )
    

    让这个公式起作用的关键是了解如何在 Vlookup Range 中使用大括号。您基本上将 Range 的第一个单元格引用定义为与 Vlookup Search_Key 匹配的列。 Range 中的其余单元格引用与您要加入的列有关。

    Index写成{2,3}返回Range的第二列和第三列(Range一共由3列组成);大括号与 Vlookup 索引中的 Arrayformula 无关,但对于从 Vlookup 函数返回多列是必需的。不写 {1,2,3} 的原因是您不想包含用于加入目的的列。

    table2中用于连接的列位于不同列的示例(在要连接的数据的右侧)

    即使第二个表中的连接列位于该表的第三列,也可以使用这种连接公式。 假设此示例中的原始数据如下所示:

    表 1(表 1):

    a d g
    b e h
    c f i
    

    表 2(表 2):

    j m c
    k n a
    l o b
    

    如果你这样写公式,你仍然会得到想要的结果(如连接数据表中所示):

    =ArrayFormula(
       {
         Sheet1!A1:C,
         vlookup(Sheet1!A1:A, {Sheet2!C1:C, Sheet2!A1:B}, {2,3}, false)
       }
    )
    

    连接数据表:

    a d g k n
    b e h l o 
    c f i j m
    

    在 Join-formula 中,注意 Table2 的第三列位于 Vlookup Range 中的第一个单元格引用!
    这样做的原因是,当您在 Range 中使用大括号(与 Arrayformula 一起使用)时,Vlookup Search_Key 不会在原始数据中查找列作为公分母,而是使用其中的 Array大括号作为参考来查找作为公分母的列(默认情况下,这是 Range 的第一列)。

    我已经写了一个关于这个主题的综合指南:

    'Mastering Join-formulas in Google Sheets'

    【讨论】:

      【解决方案4】:

      如果您可以将每个“索引”(a、b、c)映射到特定的行或列,那么您可以使用INDEX 函数。

      在这种情况下,您可以将“a”映射到 A 列(或第 1 行),将“b”映射到 B 列(或第 2 行),依此类推。

      另外,Merge Tables 似乎解决了这个确切的用例。

      【讨论】:

      • Merge Tables 是 Fusion Tables 功能,而不是 Sheets 功能。
      【解决方案5】:

      我通过使用 Javascript LINQ(语言集成查询)解决了这个问题。

      它允许您指定具有复杂连接条件的 Javascript。您还可以执行其他 SQL 查询,例如对工作表进行分组、投影、排序和过滤,就好像它们是数据库表一样。看看下面的链接。

      请注意,在 LINQ 查询语言中,我将列名中的所有空格都替换为下划线,以使它们成为有效的 JS 标识符。

      https://docs.google.com/spreadsheets/d/1DHtQlQUlo-X_YVfo-Wo-b7315sSk2pxL5ci4Y9lxvZo/edit?usp=sharing

      https://script.google.com/d/1R5L2ReHJrBRwyoSoVOFLzEQZiGtxidPfPkAeVownt7SWX6TpacY7gA7j/edit?usp=sharing

      【讨论】:

        【解决方案6】:

        使用 A5:C7 中的“其他”表,请尝试:

        =query({A1:C3,query(sort(A5:C7,1,TRUE),"Select Col2,Col3")})
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-08-10
          • 2012-02-26
          • 2012-05-07
          • 1970-01-01
          • 2013-04-21
          • 1970-01-01
          • 2012-10-17
          相关资源
          最近更新 更多