可以在每个类别中选择两行
我有一张如下表格
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 |
所有的想法都表示赞赏!
答案 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