0
votes

Marquer les valeurs dupliquées mySQL sans utiliser de groupe par

Pouvez-vous aider à marquer les valeurs dupliquées dans une colonne supplémentaire sans regrouper des valeurs dupliquées?

Voir mes exemples de données (exemple de ce que j'ai et ce dont j'ai besoin pour atteindre à droite):

 Entrez la description de l'image ici

Comme vous pouvez le voir, j'ai un identifiant de produit avec suffixe e (puissance) et g (gaz). Certains ID de produit sont dupliqués: le même identifiant de produit - un avec E et le second avec g fait double produit . .

ID de produit uniquement avec E fait Power_only_Product , ID de produit uniquement avec g fait gas_only_product , le même produit ID avec E et g fait Dual Produit .

La chose délicate consiste à ajouter une colonne sur le site droit avec des informations que l'identifiant est double produit et lequel est uniquement de l'alimentation ou du gaz uniquement.

Pouvez-vous m'aider à obtenir une telle colonne sans regrouper les ID du produit? Merci d'avance! Pawel


0 commentaires

3 Réponses :


0
votes

Vous ne mentionnez pas quelle base de données vous utilisez, donc je suppose que c'est MySQL 8.x.

Il est probablement préférable de séparer le ID à partir du type à partir du type à l'aide d'un CTE. Ensuite, la requête devient beaucoup plus facile. Par exemple: xxx

Notez que j'utilise Union tout . En effet, MySQL n'applique pas (encore) les jointures extérieures complètes. L'astuce ici consiste à répéter la requête quelque peu inversée .


0 commentaires

0
votes
SELECT t1.*,
       CASE WHEN t2.CustomerAccount IS NOT NULL
            THEN 'Dual Product'
            WHEN t1.Product = 'Gas'
            THEN 'Gas Only'
            WHEN t1.Product = 'Power'
            THEN 'Power Only'
            ELSE 'Wrong product type'
            END ProductType
FROM sourcetable t1
LEFT JOIN sourcetable t2 ON t1.CustomerAccount = t2.CustomerAccount
                        AND t1.Product != t2.Product    
The query do NOT use ProductID and do NOT check that it matches CustomerAccount and/or Product. It will be excess work without any profit.

2 commentaires

Merci, j'ai également pensé à rejoindre la table. Votre solution m'a donné des doublons, je pense parce que la jointure est faite sur CustomerAccount. Y a-t-il un moyen de le modifier afin que la table soit jointe à l'aide d'ID de produit? Merci


@Pawel_l à gauche (T1.Production, longueur (T1.Product) - 1) = gauche (T2.Production, longueur (T2.Product) - 1) , par exemple.



1
votes

Si vous exécutez MySQL 8.0, vous pouvez le faire avec des fonctions de fenêtre uniquement, sans jointures, sous-requêtes ou CTES.

Je suggérerais de comparer simplement les valeurs maximales et minimales du produit code> pour chaque client; Quand ils diffèrent, vous avez un "Produit double". P>

select
    t.*,
    case when min(product) over(partition by customer_account) <> max(product) over(partition by customer_account)
        then 'Dual Product' 
        else concat(product, ' Only')
    end single_or_dual_product
from mytable t


0 commentaires