【问题标题】:How can i get just the latest 2 records on each group when using GROUP_CONCAT?使用 GROUP_CONCAT 时,如何获取每个组的最新 2 条记录?
【发布时间】:2020-07-23 00:00:40
【问题描述】:
SELECT id, GROUP_CONCAT(type SEPARATOR '/') as types FROM `sems` GROUP by year

我只想获取每组的最新记录

【问题讨论】:

  • 哪一列确定每组中的“最新”记录是什么?您可以在问题中包含示例数据吗?
  • 为什么 GROUP_CONCAT 必须成为解决方案的一部分?
  • 我有 3 列 id(自动增量)、类型和年份。我结合了按年份分组的类型。问题是我只需要根据每个组的 id 获取最后 2 条记录

标签: mysql sql group-by greatest-n-per-group group-concat


【解决方案1】:

如果你的数据不是太多,可以使用:

SELECT id,
       SUBSTRING_INDEX(GROUP_CONCAT(type ORDER BY ? DESC SEPARATOR '/'), '/', -2) as types
FROM `sems`
GROUP by year;.

? 用于定义“最新”的列

【讨论】:

    【解决方案2】:

    如果你运行的是 MySQL 8.0,你可以使用 row_number() 来做这个。您需要一个排序列来定义 latest 记录,我假设 ordering_id:

    select id, group_concat(type order by rn separator '/') types
    from (
        select id, type, row_number() over(partition by id order by ordering_id desc) rn
        from sems
    ) t
    where rn <= 2
    group by id
    

    在早期版本中,一种选择是使用子查询进行过滤:

    select id, group_concat(type order by rn separator '/') types
    from sems s
    where s.ordering_id >= (
        select s1.ordering_id
        from sems s1
        where s1.id = s.id
        order by s1.ordering_id desc
        limit 2
    )
    group by id
    

    这假设 (id, ordering_id) 元组是唯一的。如果不是,并且前 2 名并列,则将考虑所有相关记录。

    【讨论】:

    • 不幸的是我没有使用 8.0 版本
    • @AdorDomingo:我用早期版本的解决方案更新了我的答案。
    • 我有 3 列 id(自动增量)、类型和年份。我结合了按年份分组的类型。问题是我只需要根据每个组的 id 获取最后 2 条记录。谢谢
    猜你喜欢
    • 1970-01-01
    • 2016-11-26
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    • 1970-01-01
    • 2018-11-22
    • 2012-06-15
    相关资源
    最近更新 更多