我见过这个问题,这几乎正是我想要的。但我无法使用标准 SQL 在 Bigquery 上运行它,因为 BQ 不允许用户定义变量。
Note- 我有任意数量的组,所以UNION
按照链接问题中的第一个答案来处理所有这些是不可行的。
以下是最简单的示例,尽管任何解决方案
应该能够扩展到需要的 n 个顶级结果:
给定一个如下表,其中包含人员、组和年龄列,
你如何找到每组中最年长的 2 个人? (内有联系
组不应产生更多结果,但应给出任何组中的前 2 个结果
命令)
+--------+-------+-----+
| Person | Group | Age |
+--------+-------+-----+
| Bob | 1 | 32 |
| Jill | 1 | 34 |
| Shawn | 1 | 42 |
| Jake | 2 | 29 |
| Paul | 2 | 36 |
| Laura | 2 | 39 |
+--------+-------+-----+
期望的结果集:
+--------+-------+-----+
| Shawn | 1 | 42 |
| Jill | 1 | 34 |
| Laura | 2 | 39 |
| Paul | 2 | 36 |
+--------+-------+-----+
链接问题中的一个答案提到使用ROW_NUMBER
确实存在,但我不知道如何重新启动每个组的号码。
This is row_number()
:
select t.*
from (select t.*,
row_number() over (partition by group order by age desc) as seqnum
from t
) t
where seqnum <= 2;
row_number()
是 ANSI 标准窗口函数。它在大多数数据库中都可用。一般来说,我建议您更多地寻找使用 Postgres 而不是 MySQL 的解决方案来解决 BQ 中的问题(如果您本身找不到 BQ 资源)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)