如何在Google表格的QUERY() 函数中获取“唯一”的行,并在判定唯一性时忽略某一列?

编程语言 2026-07-09

我有一组数据,看起来是这样的:每个行程是一个包含日期、系统、线路、公交路线、距离和模式这六个元素的六元组:

original data

(这份数据所来自的电子表格在这里:https://docs.google.com/spreadsheets/d/1y5aIbaO2IoYSqo4anvnPce1m2aMmKJgqTphEZZ_xQGw/edit?usp=sharing

我想要找出前十个最长的行程,因此我执行查询,并按第E列降序排序:

=QUERY('Mileage 2026'!A:E, "select * where E is not null order by E desc limit 10")

然而,这会产生在系统、线路、公交路线和距离列上相同,只有日期列不同的行(如MNR-New Haven、Amtrak-Hartford和 NJT Rail-NEC行程):

top ten length, but with duplicates excepting date

我尝试使用 SORTN,但它返回同样长度中的最早一条行程:

=SORTN('Mileage 2026'!A2:E, 10, 2, 5,FALSE)

top ten length from SORTN, but Amtrak-New Haven is showing the first trip rather than latest

我希望只显示最长且是最新的行程,并保留日期列。带有示例数据(按长度降序排序)的电子表格,以及预期的前15项输出在这里:https://docs.google.com/spreadsheets/d/17AFh9t5RQ4WY7XjZv-JCKmFOIDYgSaLPA3RLtFXaGSk/edit?usp=sharing

如何在Google Sheets查询语言中实现?

解决方案

要按距离获取所有路线,移除仅日期不同的重复项,并仅保留每条路线按日期最新的一份,请使用 sort()sortn()

=sortn(
  sort('unsorted raw data'!A1:E, 1, false),
  15, 2, 5, false, 2, true, 3, true, 4, true
)

在内层的 sort() 中,列 1 被指定为排序键,这意味着中间结果将按时间倒序排列。

在外层的 sortn() 中,列2 到5 被指定为排序条件,display_ties_mode2,因此在列2 到5 相同的一组行中,只保留该组中的一行。保留下来的那一行是在 sort() 结果中最先出现的,也就是最新的一条。

这是因为 sort()sortn() 都是 稳定 的排序。

为了同时去除重复的距离,在查询语句中使用聚合,如下所示:

=query(
  'unsorted raw data'!A1:E, 
  "select max(A), B, C, D, max(E) 
   group by B, C, D
   order by max(E) desc 
   limit 10",
  1
)

请注意,这会让行数据略有混淆,因为结果将显示具有相同B、C、D组合时出现的最新日期和最长距离,即使这两个值来自数据中的不同行。

为避免这种情况,同样按距离分组,使用 sortn() 只获取B、C、D重复时的第一条,然后使用 sort() 按距离降序排序。

=sort(
  sortn(
    query(
      'unsorted raw data'!A2:E, 
      "select max(A), B, C, D, E
       group by B, C, D, E
       order by E desc
       label max(A) '' ",
      0
    ),
    10, 2, 2, true, 3, true, 4, true
  ),
  5, false
)

如果不需要按距离排序,可以去掉最外层的排序。

参见 sortn()query(),以及您的 示例电子表格

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章