如何通过选择分组结果中每列的最新非空值来合并/组合行?
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()作为解决方案。但这不能解决问题,因为我需要新值覆盖旧值,而不是最低或最高值。
由于
COALESCE()
不是一个聚合函数,而只能使用给定的值列表,我在这个帖子中找到了@jsowa的解决方法:为什么“COALESCE”不能与“GROUP BY”一起使用?我们可以使用
SUBSTRING_INDEX(GROUP_CONCAT())
来替代COALESCE()
。请特别注意GROUP_CONCAT()中的ORDER BY子句。 缺点是分隔符必须是任何值中未使用的字符。
返回结果