如何透過選擇分組結果中每列的最新非空值來合併/組合行?
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粉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