【发布时间】:2022-11-15 14:23:11
【问题描述】:
我有一张这样的桌子
| S.No | col1 | query | score |
|---|---|---|---|
| 1 | entry1 | query1 | 10 |
| 2 | entry1 | query2 | 2 |
| 3 | entry1 | query3 | 100 |
| 4 | entry2 | query4 | 0 |
| 5 | entry2 | query5 | 50 |
| 6 | entry2 | query6 | 20 |
我想根据每个唯一条目的分数获得前 2 行。意思是我需要
| col1 | query | score |
|---|---|---|
| entry1 | query3 | 100 |
| entry1 | query1 | 10 |
| entry2 | query5 | 50 |
| entry2 | query6 | 20 |
我现在的查询是
SELECT *
FROM (
select col1, query, score, row_number() over(partition by col1 order by score desc) as rn
FROM table)
where rn<2;
问题是我还得到了一个额外的专栏rn。是的,我知道删除select * 可以解决问题,但有更清洁的方法吗?
| col1 | query | score | rn |
|---|---|---|---|
| entry1 | query3 | 100 | 1 |
| entry1 | query1 | 10 | 2 |
| entry2 | query5 | 50 | 1 |
| entry2 | query6 | 20 | 2 |
如果没有 rn 列,我如何实现这一目标?
抱歉,如果之前有人问过这个问题,但我无法找出找到它的关键字。
我正在使用 AWS Athena,因为我的数据在 S3 中。
【问题讨论】:
-
你的 where 子句不应该是 rn <= 2
instead ofrn < 2 吗?
标签: sql amazon-athena presto trino