1
votes

Requête SQL pour regrouper par 2 colonnes et prendre la première occurrence de la 3ème colonne

Je ne suis pas doué pour les requêtes SQL, alors j'ai pensé que je demanderais ici. J'ai une table ma_table :

REMARQUE : Considérez toutes les colonnes comme des chaînes . Je les représente simplement sous forme de nombres ici pour une meilleure compréhension.

A B C
-----
1 2 3
2 5 6

Je veux que le résultat soit-

A B C
-----
1 2 3
2 2 3
2 5 6
3 5 6

Donc, en gros, supprimer les paires en double pour B, C , et en prenant la première occurrence de A pour cette paire de B, C .


7 commentaires

Bienvenue dans StackOverflow! N'hésitez pas à consulter la visite ou la Aide pour savoir comment poser des questions. Demander quelque chose comme "Je veux faire xyz" sans aucune tentative de code incluse ou des informations sur les erreurs que vous avez obtenues, les exemples de données et les résultats souhaités est susceptible d'être fermé en raison du manque d'informations pour répondre. N'oubliez pas d'ajouter tout le code pertinent, les journaux d'erreurs et tout ce qui se trouve dans votre question sous forme de texte brut, afin que nous puissions vous aider. :)


Existe-t-il également une colonne comme id ?


y a-t-il une règle pour commander?


@forpas pas d'autre colonne


@ BarbarosÖzhan pas de règle pour la commande, vous pouvez commander le résultat final comme vous le souhaitez


Modifiez le schéma de votre table pour ajouter une colonne à incrémentation automatique. Ensuite, il est facile de prendre la 1ère occurrence .


L'ajout d'une valeur d'auto-incrémentation (comme forpas ) suggérée rendra le problème beaucoup plus facile et plus simple. Mais voulez-vous VRAIMENT la première valeur de A? de la valeur minimale de A (voir la réponse ci-dessous)?


4 Réponses :


1
votes

Tout d'abord, vous feriez mieux de publier une partie de ce que vous avez essayé ici.

Dans mysql 8.0 , vous pouvez utiliser row_number () over (partition par B, C ordre par A) pour résoudre cette question.

✓

 A |  B |  C
-: | -: | -:
 2 |  2 |  3
 2 |  5 |  6
SET @rownum:=0;

select `A`, `B`, `C` from (
    select *,row_number() over (partition by `B`, `C` order by rownum) rnk from (
        select *,@rownum:=@rownum+1 AS rownum from Table1
    ) T
) T
where rnk = 1;
CREATE TABLE Table1
  (`A` int, `B` int, `C` int)
;

INSERT INTO Table1
  (`A`, `B`, `C`)
VALUES
  (2, 2, 3),
  (1, 2, 3),
  (2, 5, 6),
  (3, 5, 6)
;

db fiddle ici em>

si mysql vous pouvez suivre cette réponse ROW_NUMBER () dans MySQL


Mise à jour:

si comme @forpas dit: en prenant la première occurrence de A pour cette paire de B, C n'est pas résolu par ordre par A.

Vous devez d'abord trier le rownum:

 A |  B |  C
-: | -: | -:
 1 |  2 |  3
 2 |  5 |  6
select `A`, `B`, `C` from (
    select *,row_number() over (partition by `B`, `C` order by `A`) rnk from Table1
) T
where rnk = 1;
CREATE TABLE Table1
  (`A` int, `B` int, `C` int)
;

INSERT INTO Table1
  (`A`, `B`, `C`)
VALUES
  (1, 2, 3),
  (2, 2, 3),
  (2, 5, 6),
  (3, 5, 6)
;

db fiddle ici em>


1 commentaires

prendre la première occurrence de A pour cette paire de B, C n'est pas résolu par order by A .



1
votes

Vous semblez vouloir une agrégation:

select min(a) as a, b, c
from t
group by b, c;

Je suppose que "premier" signifie la valeur minimale de a . Les tables SQL représentent des ensembles non ordonnés, donc cela semble être l'interprétation la plus sensée.


1 commentaires

prendre la première occurrence de A pour cette paire de B, C n'est pas résolu par min (A)



1
votes

Il semble que vous deviez prendre en compte le minimum de la colonne A et le regroupement par B et C :

select min(cast(A as unsigned)) as A, cast(B as unsigned) as B, cast(C as unsigned) as C
  from my_table
 group by B , C 

La conversion

cast ( as unsigned) est utilisée pour les rendre numériques.

Démo


3 commentaires

Je suis désolé si vous n'avez pas lu la NOTE que j'ai. Toutes les colonnes sont des chaînes


prendre la première occurrence de A pour cette paire de B, C n'est pas résolu par min (A)


Eh bien, utilisez cast comme non signé puis @kev



1
votes
select min(A) as A,B,C 
from Table1
group by B,C
As, you requested this will get the minimum value of A for combinations of B and C.

1 commentaires

prendre la première occurrence de A pour cette paire de B, C n'est pas résolu par min (A)