代码之家  ›  专栏  ›  技术社区  ›  Siva

根据不同的列选择唯一的分组合并行

  •  1
  • Siva  · 技术社区  · 5 年前

    给定表可以有以下行。

    i、 对于给定的 filename ,可以有两个唯一的 version_id (s) 一。

    file_id    version_id      filename
    1          OS_v1           abc.update
    1          App_v1          abc.update
    2          OS_v2           xyz.update
    2          App_v2          xyz.update
    3          OS_v1           abc(1).update
    3          App_v1          abc(1).update
    
    PRIMARY KEY (`version_id`, `filename`)
    

    在给定的示例中,row set with file_id=3 file_id=1

    注意:很容易为操作系统和应用程序版本定义单独的列,但这需要大量的代码更改,我们不想经历这些更改。

    SELECT 只返回 file_id = 1 file_id = 2 file_id = 3

    版本号\u id 分组依据 文件名 ,但第2行与第1行重复

    SELECT   DISTINCT(GROUP_CONCAT(version_id SEPARATOR '-')) ,
             filename
    FROM     schema_name.table_name
    GROUP BY filename;
    

    退货:

    concat_version patch_filename
    OS_V1-APP_V1   xyz.update
    OS_V2-APP_V2   abc(1).update
    OS_V1-APP_V1   abc.update
    
    1 回复  |  直到 5 年前
        1
  •  1
  •   GMB    5 年前

    问题:是否有一个SELECT查询只返回file_id=1和file_id=2,而忽略file_id=3

    如果您使用的是MySQL 8.0,那么可以利用window函数 ROW_NUMBER()

    SELECT x.file_id, x.version_id, x.filename
    FROM (
        SELECT t.*, ROW_NUMBER() OVER(PARTITION BY version_id ORDER BY file_id) rn
        FROM master_logs.system_patches t    
    ) x
    WHERE x.rn = 1
    

    内部查询为中的每个记录指定一个行号 version_id file_id ,外部查询将筛选具有行号的记录 1 .


    NOT EXISTS

    SELECT t.file_id, t.version_id, t.filename
    FROM master_logs.system_patches t 
    WHERE NOT EXISTS (
        SELECT 1 
        FROM master_logs.system_patches t1
        WHERE t1.version_id = t.version_id AND t1.file_id < t.file_id
    )