【问题标题】:MYSQL | Get rows which has maximum column value within a group belonging to a particular statusMYSQL |获取属于特定状态的组中具有最大列值的行
【发布时间】:2022-11-04 02:19:47
【问题描述】:

架构详细信息

我们正在一个项目中维护集合数据。 Collections 表的主要列是id(INT)collectionId(String UUID)versionNo(INT)status(PUBLISHED/NEW/PURCHASED/DELETED/ARCHIVED)。每个集合可以有多个版本。对于每个不同的版本,versionNoidstatus 列将具有不同的值,但 collectionId 将是相同的。

样本数据

id     collectionId                            versionNo   status
5   17af2c88-888d-4d9a-b7f0-dfcbac376434    1       PUBLISHED
80  17af2c88-888d-4d9a-b7f0-dfcbac376434    2       PUBLISHED
109 17af2c88-888d-4d9a-b7f0-dfcbac376434    3       NEW
6   d8451652-6b9e-426b-b883-dc8a96ec0010    1       PUBLISHED

问题陈述

我们想要获取最高发布版本的集合的详细信息。例如:对于上述数据集,所需的输出是

id     collectionId                            versionNo   status
80  17af2c88-888d-4d9a-b7f0-dfcbac376434    2       PUBLISHED
6   d8451652-6b9e-426b-b883-dc8a96ec0010    1       PUBLISHED

我们尝试了以下查询,但要么获取重复条目,要么仅获取单个版本的集合:

  1. select * from Collections where status="PUBLISHED" group by collectionId having versionNo=max(versionNo);

  2. select T1.* from Collections T1 inner join Collections T2 on T1.collectionId = T2.collectionId AND T1.id <> T2.id where T1.status="PUBLISHED" AND T1.versionNo > T2.versionNo;

    更新: 我使用的是 MYSQL 版本 5.7.12。

【问题讨论】:

    标签: mysql join group-by greatest-n-per-group


    【解决方案1】:

    假设您正在运行 MySQL 8+,请使用 ROW_NUMBER()

    WITH cte AS (
        SELECT *, ROW_NUMBER() OVER (PARTITION BY collectionId ORDER BY versionNo DESC) rn
        FROM Collections
        WHERE status = 'PUBLISHED'
    )
    
    SELECT id, collectionId, versionNo, status
    FROM cte
    WHERE rn = 1;
    

    【讨论】:

      【解决方案2】:

      为了获得最高版本,您必须使用连接将集合数据与其自身进行比较,如下所示

      select C1.* from Collections C1 
         left join Collections C2 on C1.collectionId = C2.collectionId 
         AND C1.status="PUBLISHED" AND C2.status="PUBLISHED" 
         AND C1.versionNo < C2.versionNo 
         WHERE C2.versionNo IS NULL 
         AND C1.status="PUBLISHED"
      

      【讨论】:

        猜你喜欢
        • 2017-04-13
        • 1970-01-01
        • 2023-03-08
        • 2021-03-30
        • 1970-01-01
        • 1970-01-01
        • 2021-02-01
        • 1970-01-01
        • 2017-12-27
        相关资源
        最近更新 更多