利用非空值组合对MySQL行进行分组的方法
P粉002023326
P粉002023326 2023-09-06 21:35:03
0
1
612

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

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粉002023326
P粉002023326

全部回复(1)
P粉979586159

由于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
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板