【问题标题】:sql get top n row based for each unique entrysql为每个唯一条目获取前n行
【发布时间】: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 <= 2instead of rn < 2 吗?

标签: sql amazon-athena presto trino


【解决方案1】:

不,目前无法在不指定所有列的情况下从表中排除列。这不是标准 SQL、AFAIK 的一部分,Presto/Trino 没有实现它。所以你需要在最后的 SELECT 中指定所有需要的列:

select col1, query, score
from ...

有用的链接:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-06
    • 1970-01-01
    • 2015-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-30
    • 1970-01-01
    相关资源
    最近更新 更多