Ma question est peut-être semblable à ces questions:groupe MySQL par avec ordre et la priorité de plusieurs colonnes avec sélection multiple règles
- MySQL group by with ordering/priority of another column
- Grouping by Column with Dependence on another Column
- MySQL GROUP BY with preference
Tableau Exemple:
source zip phone street city created_at
==================================================================
a 11111 11111 Flatlands null 2015-01-01
b 11111 11111 Flatlands Avenue New York 2015-01-01
c 11111 11111 Ave Flatlands New York 2015-01-01
a 22222 22222 Favory New York 2015-01-01
b 22222 22222 Favory Avenue New York 2017-12-12
c 22222 22222 Ave Favory New York 2015-01-01
b 33333 33333 Sixteenth Washington 2015-01-01
c 33333 33333 st. 16th null 2015-01-01
c 44444 44444 st. West Land null 2015-01-01
Disons que j'ai une table avec des informations sur les lieux dans différentes villes. Les informations proviennent de 3 sources différentes: a
, b
et c
.
zip
et phone
les champs identifient de façon unique l'emplacement, de sorte que les lignes de la base de données peuvent être regroupées par ces champs.
J'ai besoin de fusionner des informations sur divers emplacements à partir de diverses sources en sélectionnant la meilleure valeur en fonction de l'ensemble des règles pour les colonnes street
et city
.
Les règles sont les suivantes:
- Pour chaque groupe des valeurs non vides prioriser des
street
etcity
sur les valeurs nulles. - Dans chaque groupe, les valeurs de prioriser
street
etcity
colonnes dea
etb
sources surc
source (poids (a
) = poids (b
)> poids (c
)) si ces colonnes ne sont pas vides. - Pour les sources
a
etb
, donnez la priorité aux valeurs de colonne des lignes dont la date et l'heure sontcreated_at
.
Voici le résultat que je souhaite recevoir:
zip phone street city
====================================
11111 11111 Flatlands New York
22222 22222 Favory Avenue New York
33333 33333 Sixteenth Washington
44444 44444 st. West Land null
Here is a DB Fiddle to play with.
Je ne suis pas sûr que cela soit possible avec SQL et peut-être que ma meilleure option est de passer à la tâche de traitement de base de données NoSQL DB +. Ou utilisez simplement un outil pour extraire des informations de la base de données et ensuite les traiter.
P.S. Ceci est un exemple simplifié.
Les premier et deuxième critères peuvent être vérifiés dans une requête GROUP BY, mais le troisième ne le peut pas. Vous ** ne pouvez pas ** sélectionner des lignes en utilisant 'GROUP BY'. 'GROUP BY' calcule de nouvelles lignes en utilisant les données de chaque groupe. Vous ** ne pouvez pas ** sélectionner des lignes en utilisant 'GROUP BY'. 'GROUP BY' calcule de nouvelles lignes en utilisant les données de chaque groupe. Jetez un coup d'oeil à [cette réponse] (https://stackoverflow.com/a/28090544/4265352) sur une [question similaire (mais beaucoup plus simple)] (https://stackoverflow.com/q/12102200/4265352). – axiac
Je ne voudrais pas écrire une requête monstre (avec ou sans GROUP BY) pour exécuter chaque fois que j'ai besoin d'obtenir des valeurs de la table. Je traiterais cela comme une table de brouillon et je créerais une autre table pour stocker une rangée pour chaque paire ('zip',' phone') avec les autres champs organisés en utilisant tous les critères dont vous avez besoin. Les scripts qui ont besoin des données liront depuis la table "clean"; un autre script utiliserait la table "draft" pour calculer les enregistrements "clean". Celui-ci peut s'exécuter périodiquement (et traiter toutes les lignes) ou seulement lorsque de nouvelles lignes sont ajoutées au "draft" (et recalculer uniquement les enregistrements "clean" affectés). – axiac
Dans un autre SGBD, vous utiliseriez simplement ROW_NUMBER avec une partition et un ordre de tri appropriés pour classer les enregistrements. Comme MySQL manque de 'ROW_NUMBER', cherchez comment émuler' ROW_NUMBER' dans MySQL avec des variables. –