Je veux retourner les 10 meilleurs enregistrements de chaque section dans une seule requête. Quelqu'un peut-il m'aider à le faire? La section est l'une des colonnes du tableau.
La base de données est SQL Server 2005. Je souhaite renvoyer le top 10 par date entrée. Les sections sont commerciales, locales et fonctionnelles. Pour une date particulière, je veux uniquement les 10 premières lignes professionnelles (entrée la plus récente), les 10 premières lignes locales et les 10 meilleures fonctionnalités.
Réponses:
Si vous utilisez SQL 2005, vous pouvez faire quelque chose comme ça ...
Si vos RankCriteria ont des liens, vous pouvez renvoyer plus de 10 lignes et la solution de Matt peut être meilleure pour vous.
la source
DENSE_RANK
qui n'a pas de lacunes dans la numérotation. +1En T-SQL, je ferais:
la source
ROW_NUMBER
fonction. Par exemple, j'ai utilisé cette solution dans SQLite.Cela fonctionne sur SQL Server 2005 (modifié pour refléter votre clarification):
la source
la source
r
. fixé.Je le fais de cette façon:
mise à jour: Cet exemple de GROUP BY fonctionne uniquement dans MySQL et SQLite, car ces bases de données sont plus permissives que SQL standard concernant GROUP BY. La plupart des implémentations SQL nécessitent que toutes les colonnes de la liste de sélection qui ne font pas partie d'une expression d'agrégation se trouvent également dans GROUP BY.
la source
Si nous utilisons SQL Server> = 2005, nous pouvons résoudre la tâche avec un seul choix :
la source
top 1
fonctionne avec l'case
instruction dans laorder by
clause renvoyant 0 ou 1?Si vous savez quelles sont les sections, vous pouvez faire:
la source
Je sais que ce fil est un peu ancien mais je viens de tomber sur un problème similaire (sélectionnez le plus récent article de chaque catégorie) et voici la solution que j'ai trouvée:
Ceci est très similaire à la solution de Darrel mais surmonte le problème de RANK qui pourrait renvoyer plus de lignes que prévu.
la source
JOIN
au lieu deLEFT JOIN
, car il n'y aura jamais d'enregistrementTopCategoryArticles
sansArticle
enregistrement correspondant .J'ai essayé ce qui suit et cela a fonctionné avec des liens aussi.
la source
Si vous souhaitez produire une sortie groupée par section, en affichant uniquement les n premiers enregistrements de chaque section, quelque chose comme ceci:
... alors ce qui suit devrait fonctionner de façon assez générique avec toutes les bases de données SQL. Si vous voulez le top 10, changez simplement le 2 en 10 vers la fin de la requête.
Installer:
la source
L' opérateur UNION pourrait-il travailler pour vous? Avoir un SELECT pour chaque section, puis les UNION ensemble. Je suppose que cela ne fonctionnerait que pour un nombre fixe de sections.
la source
Q) Trouver les enregistrements TOP X de chaque groupe (Oracle)
6 lignes sélectionnées.
la source
Alors que la question concernait SQL Server 2005, la plupart des gens sont passés à autre chose et s'ils trouvent cette question, quelle pourrait être la réponse préférée dans d'autres situations est celle utilisée
CROSS APPLY
comme illustré dans ce billet de blog .Cette requête implique 2 tables. La requête de l'OP ne concerne qu'une seule table, au cas où une solution basée sur une fonction de fenêtre pourrait être plus efficace.
la source
Vous pouvez essayer cette approche. Cette requête renvoie les 10 villes les plus peuplées pour chaque pays.
la source