2010-11-28 10 views
3

私は列ID、言語ID、日付、タイトル、ArticleContentを持つNewsArticlesというテーブルを持っています。私はの最新の5つのニュース記事をデータベース内の各言語で選択するビューを作成したいと考えています。テーブルの列の特定の値に対して最大N個のレコードを選択するにはどうすればよいですか?

たとえば、英語、フランス語、ドイツ語の3言語がある場合、クエリは15件の最新の英文ニュース記事5件を含む15個のレコードを返します。どのようにしてそのようなクエリを構築できますか?

のNewsArticlesの一意の言語IDは、降順で並べ替えられた上位5個のレコードを返します。あなたが時間通りに作成された記事とcreatedontime列を持っていると仮定すると

答えて

3

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

可能であれば、結合を使用することをお勧めします。 –

+0

私はなぜそれを聞かれますか? CTEは非常に強力で、おそらくMSがこれまでにTSQLに追加した最高のものです。 –

+0

@Jakeでは、結合を使用する利点はありません。 @パベルの答えは間違いなくこれを行うための最善の方法です。それは最も速く、最もクリーンで、最も扱いやすいものです。 – 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 

unionはすべての選択を1つの結果セットに戻します。

+0

は実際に、私がしたいことは**しかしそこに多くのことが起こる、各言語の最新5件のニュース記事を集約ビューを構築することですデータベース**では、英語、フランス語、ドイツ語だけではありません。 –

+0

すべての言語を取得するには、カーソルを使用して必要なsqlを構築してから、その文字列をexecします。 –

+0

ジョインでこれを達成できないのでしょうか? –

0

あなたはこのような何かしたいです -

select * 
from LatestNews 
where (
    select count(*) from LatestNews as A 
    where A.LanguageID = LatestNews.LanguageID 
) <= 5 order by Date DESC; 
関連する問題