搜索

首页  >  问答  >  正文

利用非空值组合对MySQL行进行分组的方法

如何通过选择分组结果中每列的最新非空值来合并/组合行?

id 用户 水果 数字 创建时间
1 苹果 2022-01-01
2 约翰 西瓜 32 2022-01-02
3 约翰 72 2022-01-03
4 约翰 2022-01-04

以下方法不起作用:

SELECT
  user,
  COALESCE(fruit) as fruit,
  COALESCE(number) as number,
FROM mytable
GROUP BY user
ORDER BY created_at DESC

我希望结果是:

Jane   Apple   Null
John   Pear    72

问题在于COALESCE()函数不适用于值集,而只适用于列表。

许多主题提到使用MIN()或MAX()而不是COALESCE()作为解决方案。但这不能解决问题,因为我需要新值覆盖旧值,而不是最低或最高值。

P粉002023326P粉002023326494 天前630

全部回复(1)我来回复

  • P粉979586159

    P粉9795861592023-09-07 20:00:18

    由于COALESCE()不是一个聚合函数,而只能使用给定的值列表,我在这个帖子中找到了@jsowa的解决方法:为什么“COALESCE”不能与“GROUP BY”一起使用?

    我们可以使用SUBSTRING_INDEX(GROUP_CONCAT())来替代COALESCE()

    请特别注意GROUP_CONCAT()中的ORDER BY子句。 缺点是分隔符必须是任何值中未使用的字符。

    SELECT
      user,
      SUBSTRING_INDEX(GROUP_CONCAT(fruit ORDER BY created_at DESC SEPARATOR '|'), '|', 1) AS fruit,
      SUBSTRING_INDEX(GROUP_CONCAT(number ORDER BY created_at DESC SEPARATOR '|'), '|', 1) AS number,
    FROM mytable
    GROUP BY user;

    返回结果

    Jane   Apple   Null
    John   Pear    72

    回复
    0
  • 取消回复