/ / Comment obtenir le nom le plus populaire par année dans SQL Server - sql, sql-server

Comment obtenir le nom le plus populaire par année dans SQL Server - sql, sql-server

Je pratique SQL dans Microsoft SQL Server 2012 (ce n’est pas une question de devoir) et j’ai une table Names. Le tableau montre les prénoms par année, avec des colonnes Sex (genre du nom), N (nombre de bébés portant ce nom), Yr (année), et Name (le nom lui-même).

J'ai besoin d'écrire une requête en utilisant un seul SELECT déclaration qui renvoie le nom de bébé le plus populaire par année, avec sexe, année et nombre de bébés nommés. Jusqu'ici j'ai;

SELECT *
From Names
ORDER By N DESC;

Ce qui donne les plus hautes valeurs de N dans DESCordre, répétant des années. Je dois limiter cette valeur à la valeur la plus élevée de chaque année et tout ce que j'ai essayé de faire a généré des erreurs. Tout conseil que vous pouvez me donner pour cela serait apprécié.

Réponses:

0 pour la réponse № 1

Du haut de ma tête, quelque chose comme ce qui suit vous permettrait normalement de le faire (techniquement) dans un seul état SELECT. Cette déclaration inclut des sous-sélections, mais je ne vois pas immédiatement une alternative qui ne le serait pas.

Quand il y a "top top noms communs, les deuxles requêtes doivent ramener tous les meilleurs résultats communs, de sorte qu'il peut ne pas y avoir exactement une réponse. Si vous avez simplement besoin d’une seule ligne aléatoire représentative parmi ces résultats, envisagez d’utiliser select top 1, peut-être en ajoutant order by obtenir le premier par ordre alphabétique.

Le plus populaire par année, peu importe le sexe:

-- ONE PER YEAR:
SELECT n.Year, n.Name, n.Gender, n.Qty FROM Name n
WHERE NOT EXISTS (
SELECT 1 FROM Name n2
WHERE n2.Year = n.Year
AND n2.Qty > n.Qty
)

Le plus populaire par année pour chaque sexe:

-- ONE PER GENDER PER YEAR:
SELECT n.Year, n.Name, n.Gender, n.Qty FROM Name n
WHERE NOT EXISTS (
SELECT 1 FROM Name n2
WHERE n2.Year = n.Year
AND n2.Gender = n.Gender
AND n2.Qty > n.Qty
)

En dépit de la verbosité du code SQL, les performances sont généralement au même niveau que les alternatives lorsque vous utilisez ce modèle (souvent meilleur).

Il existe d'autres approches, y compris l'utilisation d'instructions GROUP, mais personnellement, je trouve celle-ci plus lisible et le SGBD croisé standard.