2017-06-30 50 views
1

我有一张表格,里面保存了我想要在另一张表格中进行过滤和排序的原始数据。我如何为只有一列的GROUP BY,同时仍然可以通过并选择其他列?

原始数据片
Raw data

片材的目标是:

  • 只显示最高RankNameLevel 12或低于
  • 排序从最高到的结果最低Damage

我展示和排序的所有项目进行的12或以下使用ORDER BY一个Level

=ARRAYFORMULA(QUERY(RAW!2:1000, "select A,B,D where C<=12 and A<>'' order by D desc"))

以损伤
Sorted

排序但是,这仍然显示太多的条目。我可以用MAX()GROUP BY过滤条目:

=ARRAYFORMULA(QUERY(RAW!2:1000, "select A,max(B) where C<=12 and A<>'' group by A label max(B) ''"))

筛选,仅显示最高等级
Grouped

但是,我不能排序DAMAGE要不然我得到这个错误:

Unable to parse query string for Function QUERY parameter 2: 
COL_IN_ORDER_MUST_BE_IN_SELECT: `D` 

并尝试添加该公司lumn到SELECT节给出此错误:

Unable to parse query string for Function QUERY parameter 2: 
ADD_COL_TO_GROUP_BY_OR_AGG: D 

的错误意味着我不能包括不是任一聚合式(像MAX)或不是GROUP BY的一部分(其DAMAGE不是)字段。

我的目标是:

筛选,仅显示最高等级受到伤害
Goal

排序我怎么会去查询第一板与上述落得片?


以下是实际工作表。如果您想测试解决方案,请随时分叉。
https://docs.google.com/spreadsheets/d/1XG3eTSc-8eYRh-6ekq_2BjZgleUVCz3v45PLozXe8Xo/edit

回答

1

如果您从您的查询工作(无需ARRAYFORMULA)

= QUERY(原2:500,“选择A,B,d其中C < = 12和A <> ''为了通过d降序“)

您可以过滤查询结果,让您所需的输出:

=FILTER(A2:C,MMULT((A2:A=TRANSPOSE(A2:A))*(B2:B<TRANSPOSE(B2:B)),SIGN(ROW(B2:B)))=0) 

我还没有成功,两者结合。

+0

这似乎完成了工作!现在,我只是想在接受它之前了解它是如何工作的。这次真是万分感谢。 – Koviko

+0

MMULT在A中的每个唯一值的B中找到最高值。'*'是和('+'将是或)。过滤器,与查询不同,保留C列。签名将True/False更改为数字1/0。 –

0

这可能是一个微不足道的答案,但可能有助于澄清您的要求。在您的测试数据的情况下最大(伤害)是同一行之最高(职级)的,你可以把

=ARRAYFORMULA(QUERY(Raw!2:1000, "select A,max(B),max(D) where C<=12 and A<>'' group by A order by max(D) desc label max(B) '', max(D) ''")) 

如果你想要的是“造成的伤害值,一般以那种对应最高等级',那么答案就更复杂了!

+1

虽然这个答案在技术上是正确的,但我的目标是根据“Level”,“Rank”和“Name”选择行,然后返回所有关联的单元格。这确实回答了实际问题,但不是问题的精神。 – Koviko

相关问题