搜尋

首頁  >  問答  >  主體

利用非空值組合對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粉002023326448 天前591

全部回覆(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
  • 取消回覆