【问题标题】:How can I find the item id related to the maximum resource by year in SQL (postgres)?如何在 SQL (postgres) 中找到与年度最大资源相关的项目 ID?
【发布时间】:2019-11-04 08:26:03
【问题描述】:

我正在尝试运行一个看似简单的 SQL 查询,但我不明白应该使用什么机制来实现这一点。 我有下表:

| id | playcount | release_date |
| -- | --------- | ------------ |
| 1  | 47712     | 2019-12-27   |
| 2  | 626778    | 2017-07-23   |
| 3  | 827091    | 2019-09-12   |
| 4  | 66419     | 2015-09-05   |
| 5  | 58627     | 2016-09-12   |
| 6  | 60272     | 2017-09-06   |
| 7  | 1762582   | 2017-10-07   |
| 8  | 11280     | 2016-10-12   |
| 9  | 30890     | 2019-10-29   |
| 10 | 715173    | 2019-07-02   |

我想知道哪个 id 每年拥有最多 playcount。 在这个例子中,2019年playcount最大的id是3

我正在寻找以下输出:

playcount_table
| year | playcount | id |
| ---- | --------- | -- |
| 2019 | 827091    | 3  |
| 2017 | 1762582   | 7  |
| 2016 | 58627     | 5  |
| 2015 | 66419     | 4  |

我通过以下查询成功获得了每年的最大播放次数:

select to_char(date_trunc('year', TO_DATE(p_table.release_date, 'YYYY-MM-DD')), 'YYYY-MM-DD') as year,
       max(p_table.playcount) as playcounts
from playcount_table as p_table
group by year;

但我无法检索与此最大值 playcount 相关的 id

你能帮我解决这个问题吗?

提前谢谢你,

【问题讨论】:

    标签: sql postgresql datetime group-by greatest-n-per-group


    【解决方案1】:

    使用ROW_NUMBER

    WITH cte AS (
        SELECT *, ROW_NUMBER() OVER (PARTITION BY EXTRACT(year FROM release_date)
                                     ORDER BY playcount DESC) rn
        FROM playcount_table
    )
    
    SELECT
        EXTRACT(year FROM release_date) year
        playcount,
        id
    FROM cte
    WHERE
        rn = 1
    ORDER BY
        EXTRACT(year FROM release_date) DESC;
    

    如果给定年份可能有两个或更多记录并列最高播放次数,并且您想报告这两个记录,则将上面的 ROW_NUMBER 替换为 RANK

    我们也可以在这里使用DISTINCT ON

    SELECT DISTINCT ON (EXTRACT(year FROM release_date))
        EXTRACT(year FROM release_date),
        playcount,
        id
    FROM playcount_table
    ORDER BY
        EXTRACT(year FROM release_date),
        playcount DESC;
    

    【讨论】:

    • @LouisonGitzinger 。 . . DISTINCT ON 是 Postgres 中的正确解决方案。
    • @GordonLinoff 但是,我认为,基于分析函数的解决方案在这里仍然有优点(例如,OP 希望使用 RANK 来保持第一名的关系)。
    猜你喜欢
    • 2020-11-07
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 1970-01-01
    • 2020-01-24
    相关资源
    最近更新 更多