1

私もテーブルから上位5行をグループIDごとに選択します私のテーブルは

CREATE TABLE [dbo].[news](
    [pk_news] [int] IDENTITY(1,1) NOT NULL,
    [text] [text] NULL,
    [title] [nvarchar](500) NULL,
    [pk_service] [int] NULL,
    [image] [nvarchar](500) NULL,
    [pk_annalist] [int] NULL,
    [pk_user] [int] NULL,
    [pk_admin] [int] NULL,
    [accept] [int] NULL,
    [views] [int] NULL,
    [tag] [nvarchar](500) NULL,
    [news_Date] [date] NULL,
    [summary] [nvarchar](500) NULL,

そして私も各pk_serviceから行を選択したい

4

2 に答える 2

2

まず、「トップ5」に入るとはどういう意味かを指定する必要があります。これは視聴回数によるものですか?、最新のnews_date ?、何ですか?ビューの数によると仮定すると、次のようになります。

まず、行ごとに、現在のレコード値よりも大きいビューの値を持つ同じpk_select内のレコードの数を計算する式が必要です。

nが現在の行のエイリアスであるとすると、次のようになります。

    Select Count(*) From news 
    Where pk_select = n.pk_Select
        And views >= n.views

次に、これを副選択として外部クエリのWhere句に埋め込みます

 Select * From news n
 Where (Select Count(*) From news 
        Where pk_select = n.pk_Select
           And views >= n.views) < 5

これは、ビューの値に各pk_Selectグループの重複が含まれていない場合にのみ、完全に正しい答えを生成します。重複している場合は、row_number関数を使用する必要があります

   With Rows As
   (
          Select *, 
          Row_Number() Over (Order By Views) as rowNum
          From news
   )
   Select * From Rows
   Where RowNum <= 5
于 2013-03-14T13:28:24.117 に答える
2
select 
    x.*
    ,n.*
from dbo.news n
join (
    select 
        pk_news
        ,[rwn] = row_number() over(partition by pk_service order by pk_news asc)
    from dbo.news
) x
on n.pk_news=x.pk_news and x.rwn < 6
order by 
    n.pk_service, x.rwn
于 2013-03-14T13:31:42.177 に答える