【问题标题】:How to get the first 5 records f a query to use in another query如何获取查询的前 5 条记录以在另一个查询中使用
【发布时间】:2022-01-22 02:39:03
【问题描述】:

我有这个问题:

select name, score from tb
group by name, score
order by score desc
limit 5

输出是:

name1   90
name2   85
name3   70
name4   50 
name5   30

现在我想做同样的查询,但使用名称来执行另一个查询。我需要知道如何按照它们在第一个查询中出现的顺序“调用”2ns 最高分名称、第 3、第 4 和第 5 个名称。

类似这样的:

with 5_top as(  
select name, score from tb
    group by name, score
    order by score desc
    limit 5)

从 5_top 中选择 <2nd name_here>

所以从第一个查询中我知道 name2 是第二高分,所以在下一个查询中我可以使用 where name = name2 但如果下周 name2 下降到第三位,我的查询将失败。

【问题讨论】:

    标签: sql presto


    【解决方案1】:

    您可以使用row_number() 窗口函数来确定位置。注意它的明确排序:

    WITH dataset (name, score) AS (
        VALUES ('name1', 90),
            ('name2', 85),
            ('name3', 70),
            ('name4', 50),
            ('name5', 30)
    )
    select * 
    from (
            select *, row_number() over (order by score desc) rnk
            from dataset
        )
    where rnk > 1
    

    输出:

    name score rnk
    name2 85 2
    name3 70 3
    name4 50 4
    name5 30 5

    【讨论】:

    • 例如,如果我在第一名中有平局,我该怎么办?
    • @pouchewar 这取决于您需要实现什么逻辑。您可以切换到 rank 而不是 row_number,这将为引入间隙的连接提供相同的值(即 90、90、89 将导致 1、1、3)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    • 2020-07-14
    • 2018-01-22
    • 1970-01-01
    相关资源
    最近更新 更多