选择每个类别中的前2行

时间:2014-08-04 11:46:48

标签: sql-server

可以在每个类别中选择两行

我有一张如下表格

 DECLARE @temptable TABLE 
 ( id int IDENTITY(1,1) 
 ,name nvarchar(20) NULL 
 ,category int NOT NULL)

INSERT INTO @temptable ( name ,category)
VALUES 
( 'nikhil1' ,1)
, ('sumesh1' ,2)
, ('sumesh2' ,2)
, ('nikhil2' ,1)
, ('nikhil3',1)
, ('sumesh3' ,2)


SELECT *
FROM @temptable t
ORDER BY t.id ASC

我希望结果如下

| id | Name  | category|
|----------------------|
| 1  |nikhil1|  1      |
| 2  |nikhil2|  1      |
| 3  |sumesh1|  2      |
| 4  |sumesh2|  2      |

所有的想法都表示赞赏!

2 个答案:

答案 0 :(得分:4)

;WITH CategoriesCTE AS
(
    SELECT *,
           ROW_NUMBER() OVER(PARTITION BY category ORDER BY name) AS rn
    FROM   @temptable
)
SELECT *
FROM CategoriesCTE t
WHERE rn<=2

有一点背景知识:我们正在定义一个CTE,它将有一个额外的列,每个类别将为其项目提供一个增量数字。每次更改类别时,该数字都将归零。这由PARTITION BY中的ROW_NUMBER子句强制执行。然后我们过滤结果,得到每个类别中前两个数字的所有产品。

答案 1 :(得分:1)

CTE的替代方案是派生表,它将有效地做同样的事情......

SELECT id, name, category
FROM (
        SELECT *, ROW_NUMBER() OVER (PARTITION BY category ORDER BY name) AS rn
        FROM @temptable
     ) tbl
WHERE rn<=2