【问题标题】:retrieve only unique values via query通过查询仅检索唯一值
【发布时间】:2020-11-11 07:28:49
【问题描述】:

这是我目前使用的公式:

=query(IMPORTRANGE("XXXX","XXXXX!A:H"), 
"select Col1,Col2,Col3,Col4,Col5,Col6,Col7,Col8 
 where Col1> date '"&TEXT(F1,"yyyy-mm-dd")&"' and Col3 = '"&B1&"' and Col4 = '"&D1&"'
 order by Col1 desc",1)

公式有效。 Col1 包括输入日期。我只检索 F1 中列出的日期之后的值。 Col3 和 Col3 相应地包括在单元格 B1 和 D1 中选择的一些属性。 Col5 包括字符串(客户端名称)。客户名称可以在多行上重复。 我想只检索最近的一个。关于如何做到这一点的任何想法?

而且,为了给这个问题增加更多乐趣,检索每个客户端最旧的行是否也是同样的想法?


这是link to demo sheet,详细信息在“唯一查询”选项卡中。

另一个挑战可能是为每个客户端检索 X 行,而不仅仅是最近的行。

【问题讨论】:

  • 这个公式目前位于哪个单元格中?
  • 分享您的工作表副本
  • @MattKing - 我用演示表编辑了我的问题。谢谢
  • @player0 - 我用演示表编辑了我的问题。谢谢

标签: sorting google-sheets array-formulas google-sheets-query gs-vlookup


【解决方案1】:

解决方案

我基于可以实现此结果的 SQL 表达式,但不幸的是,Google Sheets QUERY 语言没有那么富有表现力。这就是生成的公式看起来有点混乱的原因。

=query(
IMPORTRANGE("https://docs.google.com/spreadsheets/d/1LoHg53hzQvYtOLTcDwxLY8OrKVN4F7usX8YI41BtdWg/edit","Activity list!A:E"), 
"select Col1, Col2, Col3, Col4, Col5 
where Col1= date'"&
JOIN("' or Col1 = date  '",
  ARRAYFORMULA(TEXT(ARRAY_CONSTRAIN(
    query(query(
         "THE IMPORTED RANGE", 
         "select Col1,Col2,Col3,Col4,Col5 
          where Col1> date '"&TEXT(I2,"yyyy-mm-dd")&"' and Col2 = '"&I3&"'  
          order by Col1 desc",1), 
    "select MAX(Col1), Col4 
     group by Col4 
     order by MAX(Col1) desc 
     label MAX(Col1) ''", 0),
  1000, 1),
  "yyyy-MM-DD")
))&"'",1)

从内部开始的查询规范:

  • 根据您的条件过滤数据。
  • 按客户获取最新的提交分组。
  • 将结果与整个数据集连接以获取其他列值。
    • 使用 ARRAY_CONSTRAIN 公式检索包含日期的列。

同样的方法适用于将 MAX 更改为 MIN 聚合函数的最早提交。

注意:这不适合每天多次提交。

【讨论】:

    【解决方案2】:

    我认为最简单的方法是在 query() 中使用 Vlookup。不幸的是,它涉及使用 IMPORTRANGE() 两次,但我仍然认为它比其他一些可能的方法更有效。您可以在样本表的 MK.Help 选项卡的 A2 中找到它。

    =ARRAYFORMULA(IFERROR(VLOOKUP(UNIQUE(query(IMPORTRANGE("1LoHg53hzQvYtOLTcDwxLY8OrKVN4F7usX8YI41BtdWg","Activity list!A:E"), "select Col4 where Col1> date '"&TEXT(I2,"yyyy-mm-dd")&"' and Col2 = '"&I3&"' 
     order by Col1 desc",1)),query(IMPORTRANGE("1LoHg53hzQvYtOLTcDwxLY8OrKVN4F7usX8YI41BtdWg","Activity list!A:E"), "select Col4,Col1,Col2,Col3,Col5 where Col1> date '"&TEXT(I2,"yyyy-mm-dd")&"' and Col2 = '"&I3&"' 
     order by Col1 desc",1),{2,3,4,1,5},0)))
    

    【讨论】:

    • 谢谢!这很棒。几个问题: 1. 这与公式末尾的 {2,3,4,1,5},0))) 有什么关系? 2.你能解释一下双重IMPORTRANGE背后的逻辑吗,因为它们似乎是相同的?谢谢!
    • @user13708028 {2,3,4,1,5} 是第 2、3、4、... 0 列“完全匹配”。它们不相同...有 VLOOKUP,因此第一个 importrange 输出唯一值(1 列),第二个 importrange 返回其余值
    【解决方案3】:

    尝试:

    =SORTN(QUERY(IMPORTRANGE("1LoHg53hzQvYtOLTcDwxLY8OrKVN4F7usX8YI41BtdWg", "Activity list!A:E"), 
     "where Col1 > date '"&TEXT(I2, "yyyy-mm-dd")&"' 
        and Col2 = '"&I3&"' 
      order by Col1 desc", 1), 99^99, 2, 4, 1)
    

    SORTN explained:
    
    99^99    all rows - no limits
    2        means "merge mode"
    4        collapse 4th column into unique values
    1        return 4th column ascending - 0 for descending
    

    【讨论】:

    • 谢谢。我以前没有使用过的 SORTN 似乎非常适合这种情况。它在演示表中完美运行,但是当我尝试使用我们的实时数据复制它时,它返回错误的数据。原始范围是一个活动日志,可以在任何给定日期包含与客户相关的多个输入。我们的重要性目标是仅提取与每个客户端相关的最新 N 行。我尝试根据您的解释和表格文档调整 SORTN 参数,但无法让它按我们想要的方式检索数据。再次感谢!
    • 感谢您编辑您的答案。我可能误会了什么。 SORTN 是否查找重复行?如演示表中所示,我们的行不一样。确实,多行中的几列是相同的,但有些列并不相同。
    • 不,SORTN 仅查看一个指定列(在本例中为第 4 列 - 客户名称)并通过删除所有非第一行创建一组唯一值(hance “order by Col1 desc” in query 至关重要,因为它将数据从最近的时间戳排序到过去,然后 SORTN 将删除“过去”)
    • 啊!!现在它似乎工作了,但有趣的是,它将标题行从原始范围推送到导入范围区域中的随机行。
    • @player0 按名称“排名”,但消除平局是个好主意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多