我使用Google Sheets并使用以下公式,没有任何问题:
=QUERY(Sheet!A:D,"select A, max(B) where not B is null group by A label A 'Client', max(B) 'Most Recent'")
显然,这是在返回引用数据的A列和B列然而,我也想从C列返回相应的单元格。
样本数据:https://docs.google.com/spreadsheets/d/1CJKiDNPUWMMUbLLb-UDA6iRA2PBnlMHDsEB9vELe0Rk/edit?usp=sharing
使用这个例子,我想看到的是G2细胞充满了"披萨"(即来自C3),等等
我用的是正确的公式吗?我需要更改什么?
您尝试做的不是很像SQL,因为max(B)
不指向任何特定的行:它只是所选行中B的最大值。这个值可以通过几行来获得,使得C、D的选择不明确。我不认为一个查询就能做到这一点。
这里是一个使用unique
和几个query
命令的实现。
在E2中,输入=unique(A:A)
以获得唯一客户端名称的列表。在F2中,输入
=query(A:D, "select B,C,D where A ='"&E2&"' order by B desc limit 1")
并将此公式向下拖动。这将选择A值与E2匹配的所有行,并选择一个具有最大B值的行。
您不希望在这些查询的输出中有标题行,所以添加label B '', C '', D ''
,或者不在查询范围中包括标题行。
按C、D分组的版本
要在单个查询中选择C和D,请展开select
子句
select A, max(B), C, D
这将要求包括group by
条款中的内容:
group by A, C, D
公式将是
=QUERY(A:D,"select A, max(B), C, D where not B is null group by A, C, D label A 'Client', max(B) 'Most Recent'")
这确实意味着,要分组在一起的行将是那些不仅A而且C和D相等的行。
一个可能的单一公式解决方案:
=ArrayFormula(IFERROR(VLOOKUP(UNIQUE(A2:A),SORT(A2:C,2,0),{1,2,3},0)))
以下是我所做的最终成功的事情。
在E1中,输入=unique(A:A)
以获得唯一客户端名称的列表。在F2中,输入
=query(A$2:D101, "select B,C,D where A ='"&F2&"' order by B desc limit 1")
并将此公式向下拖动。这将选择A值与E2匹配的所有行,并选择一个具有最大B值的行。
您不希望在这些查询的输出中有标题行,所以只需在标题行中添加所需的文本即可。