Maison > Questions et réponses > le corps du texte
Comment fusionner/combiner des lignes en sélectionnant la dernièrevaleur non nulle de chaque colonne dans le résultat groupé ?
id | Utilisateur | Fruits | Nombres | Temps de création |
---|---|---|---|---|
1 | Jane | Pomme | vide | 2022-01-01 |
2 | Jean | Pastèque | 32 | 2022-01-02 |
3 | Jean | vide | 72 | 2022-01-03 |
4 | Jean | Poire | vide | 2022-01-04 |
Les méthodes suivantes ne fonctionneront pas :
SELECT user, COALESCE(fruit) as fruit, COALESCE(number) as number, FROM mytable GROUP BY user ORDER BY created_at DESC
J'espère que le résultat est :
Jane Apple Null John Pear 72
Le problème est que la fonction COALESCE() ne fonctionne pas avec des ensembles de valeurs, mais uniquement avec des listes.
De nombreux sujets ont mentionné l'utilisation de MIN() ou MAX() au lieu de COALESCE() comme solution. Mais cela ne résout pas le problème car j'ai besoin que la nouvelle valeur écrase l'ancienne valeur, pas la valeur la plus basse ou la plus élevée.
P粉9795861592023-09-07 20:00:18
Puisque COALESCE()
n'est pas une fonction d'agrégation mais ne peut fonctionner qu'avec une liste de valeurs donnée, j'ai trouvé la solution de contournement de @jsowa dans cet article : Pourquoi « COALESCE » ne fonctionne pas avec « GROUP BY » ?
Nous pouvons utiliser SUBSTRING_INDEX(GROUP_CONCAT())
à la place SUBSTRING_INDEX(GROUP_CONCAT())
来替代COALESCE()
.
Veuillez prêter une attention particulière à la clause ORDER BY dans GROUP_CONCAT(). L'inconvénient est que le délimiteur doit être un caractère unused dans n'importe quelle valeur.
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;
Retour des résultats
Jane Apple Null John Pear 72