0
votes

Comment obtenir des valeurs uniques dans une colonne mais en ajoutant plus de colonnes à ma requête

J'ai une table avec les numéros de téléphone et plusieurs paquets auxquels ils appartiennent. Certains numéros appartiennent à un seul paquet et d'autres à plusieurs paquets. Les paquets sont triés par ordre croissant.

J'ai besoin d'une nouvelle table avec les nombres et seulement le premier paquet (le plus ancien).

Si j'utilise ceci:

SELECT DISTINCT Cli_Inyectados.Telefono, Cli_Inyectados.Paquete INTO New_Table
FROM Cli_Inyectados;

J'obtiendrai le même tableau car il n'y a pas d'enregistrements en double.

Si j'utilise GROUP BY ou DISTINCTROW j'obtiens le même résultat.


2 commentaires

Veuillez fournir des exemples de données et les résultats souhaités. Comment savoir quelle ligne est la plus ancienne?


Les numéros de paquet sont composés d'un nombre croissant à deux chiffres, de l'année et du numéro de la semaine. Exemple: Telefono 134583020 Paquete 39-20.w01 Les numéros de téléphone sont stockés plusieurs fois, de même que les paquets, mais pas la même combinaison.


3 Réponses :


0
votes

Utilisez une sous-requête corrélée. En supposant que vous ayez une colonne d'horodatage d'une sorte - qui est arbitrairement appelée created_at dans la requête ci-dessous:

SELECT i.Telefono, i.Paquete
INTO New_Table
FROM Cli_Inyectados as i
WHERE i.created_at = (SELECT MIN(i2.created_at)
                      FROM Cli_Inyectados as i2
                      WHERE i2.Telefono = i.Telefono
                     );


1 commentaires

@yogurblanco. . . Bien sûr. Sinon, je n'aurais pas fourni la réponse.



0
votes

Je pense comprendre ce que vous avez dit mais en fait je n'ai pas plus de champs que Telefono (numéro) et Paquete (texte court). J'ai donc essayé avec ce code après avoir vérifié que MIN pour le champ Paquete renvoie la valeur la plus basse.

SELECT i.Telefono, i.Paquete
INTO New_Table
FROM Cli_Inyectados as i
WHERE i.Paquete = (SELECT MIN(i2.Paquete)
                      FROM Cli_Inyectados as i2
                      WHERE i2.Telefono = i.Telefono
                     );

Mais cela prend beaucoup de temps donc je pense que je fais mal.

La table Cli_Inyectados actuelle contient plus de 17 000 enregistrements mais seulement 3 020 numéros de téléphone différents, donc ma New_table doit contenir 3 020 enregistrements.


0 commentaires

0
votes

Évitez la sous-requête corrélée si vous ne calculez pas les agrégations en cours. Au lieu de cela, envisagez de vous joindre à une sous-requête agrégée:

SELECT i.Telefono, i.Paquete
INTO New_Table
FROM Cli_Inyectados i
INNER JOIN
   (SELECT Telefono
         , MIN(Paquete) AS min_Paquete
    FROM Cli_Inyectados
    GROUP BY Telefono
   ) agg
 ON i.Telefono = agg.Telefono
 AND i.Paquete = agg.min_Paquete


0 commentaires