如何在Google表格的QUERY() 函数中获取“唯一”的行,并在判定唯一性时忽略某一列?
我有一组数据,看起来是这样的:每个行程是一个包含日期、系统、线路、公交路线、距离和模式这六个元素的六元组:

(这份数据所来自的电子表格在这里: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行程):

我尝试使用 SORTN,但它返回同样长度中的最早一条行程:
=SORTN('Mileage 2026'!A2:E, 10, 2, 5,FALSE)

我希望只显示最长且是最新的行程,并保留日期列。带有示例数据(按长度降序排序)的电子表格,以及预期的前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_mode 是 2,因此在列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
)
如果不需要按距离排序,可以去掉最外层的排序。