通过查询仅检索唯一值
retrieve only unique values via query
这是我目前使用的公式:
=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 行,而不仅仅是最近的行。
解决方案
我基于可以实现此结果的 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 聚合函数。
注意:这不适合每日多次提交。
我认为最简单的方法是在 query() 中使用 Vlookup。不幸的是,它涉及使用 IMPORTRANGE() 两次,但我仍然认为它比其他一些可能的方法更有效。您可以在示例 sheet.
的 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)))
尝试:
=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
这是我目前使用的公式:
=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 行,而不仅仅是最近的行。
解决方案
我基于可以实现此结果的 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 聚合函数。
注意:这不适合每日多次提交。
我认为最简单的方法是在 query() 中使用 Vlookup。不幸的是,它涉及使用 IMPORTRANGE() 两次,但我仍然认为它比其他一些可能的方法更有效。您可以在示例 sheet.
的 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)))
尝试:
=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