2010-11-28 7 views
3

J'ai une table appelée NewsArticles ayant des colonnes ID, LanguageID, Date, Titre, ArticleContent. Je veux créer une vue qui sélectionne les 5 articles les plus récents de chaque langue dans la base de données. Par exemple, si j'ai 3 langues, par exemple, l'anglais, le français et l'allemand, la requête devrait renvoyer 15 enregistrements, contenant les 5 derniers articles en anglais, le 5 ... vous obtenez l'image. Comment puis-je construire une telle requête?Comment sélectionner au plus N enregistrements pour une valeur donnée d'une colonne dans une table?

Pour chaque LanguageID unique dans NewsArticles, retourner les 5 premiers enregistrements classés par Date décroissante.

Répondre

3

C'est assez simple avec CTE.

;with x as 
(
    select ID, LanguageID, Title, Date, 
      row_number() over (partition by LanguageID order by Date DESC ) as position 
    from NewsArticles 
) 
select * from x 
where Position < 6 
+0

Je préférerais utiliser des jointures si possible. –

+0

Puis-je demander pourquoi? Les CTE sont extrêmement puissants et probablement la meilleure chose que MS ait jamais ajouté à TSQL. –

+0

@Jake, il n'y a aucun avantage à utiliser des jointures. La réponse de @ Pavel est certainement la meilleure façon de le faire. C'est le plus rapide, le plus propre et le plus facile à gérer. – IamIC

0
CREATE VIEW Top5Articles 
AS  
    SELECT top 5 * FROM LatestNews WHERE LanguageID = 1 order by createdontime desc // latest 5 English news articles 
    union 
    SELECT top 5 * FROM LatestNews WHERE LanguageID = 2 order by createdontime desc 
    union 
    SELECT top 5 * FROM LatestNews WHERE LanguageID = 3 order by createdontime desc 

En supposant que vous avez une colonne de createdontime avec l'article créé à temps.

Vous obtiendrez toutes les sélections dans un ensemble de résultats.

+0

En fait, ce que je veux est de construire une vue qui regroupe les 5 derniers articles de presse de chaque langue, ** mais beaucoup arrive qu'il y ait dans la base de données **, pas seulement en anglais, français et allemand. –

+0

Pour obtenir toutes les langues je construirais le sql requis en utilisant un curseur, puis exec la chaîne. –

+0

Cela ne pourrait-il pas être mieux réalisé avec les jointures? –

0

Voulez-vous quelque chose comme ça -

select * 
from LatestNews 
where (
    select count(*) from LatestNews as A 
    where A.LanguageID = LatestNews.LanguageID 
) <= 5 order by Date DESC; 
Questions connexes