Sql server 2005 使用行号()-查找最大注册数
我想使用row_number()函数找出每门课程的最大试卷注册量 登记表Sql server 2005 使用行号()-查找最大注册数,sql-server-2005,tsql,Sql Server 2005,Tsql,我想使用row_number()函数找出每门课程的最大试卷注册量 登记表 CourseID StudentName PaperCode 101 David 10001 101 David 20000 101 George 10000 102 Peter 10000 102 Peter 20000 102 David 20000 预期的结果可能是 CourseID| StudentName | NumberofRegis
CourseID StudentName PaperCode
101 David 10001
101 David 20000
101 George 10000
102 Peter 10000
102 Peter 20000
102 David 20000
预期的结果可能是
CourseID| StudentName | NumberofRegistration
101 David 2
102 Peter 2
我尝试了下面的查询,但无法扩展它以获得所需的结果
select
CourseID,
StudentName,
NumberOfRegistration
from
(
select
CourseID,
StudentName,
ROW_NUMBER()
over(
partition by count(papercode)
order by CourseID asc) as NumberOfRegistration
从
登记处
按CourseID、StudentName分组
)x
请帮我完成。可能是这样的:
declare @T table
(
CourseID int,
StudentName varchar(10),
PaperCode int
)
insert into @T values
(101, 'David', 10001),
(101, 'David', 20000),
(101, 'George', 10000),
(102, 'Peter', 10000),
(102, 'Peter', 20000),
(102, 'David', 20000)
select CourseID, StudentName, NumberofRegistration
from
(
select CourseID, StudentName, NumberofRegistration,
row_number() over(partition by CourseID order by NumberofRegistration desc) as rn
from
(
select CourseID, StudentName, count(*) as NumberofRegistration
from @T
group by CourseID, StudentName
) as T
) as T
where rn = 1
测试数据
DECLARE @tbl TABLE(CourseID INT,StudentName VARCHAR(100),PaperCode INT)
INSERT INTO @tbl
VALUES
(101,'David',10001),
(101,'David',20000),
(101,'George',10000),
(102,'Peter',10000),
(102,'Peter',20000),
(102,'David',20000)
查询
正如Mikael Eriksson所说,这将在SQL Server 2005/2008中起作用。但它在SQLServer2012中不起作用
;WITH CTE
AS
(
SELECT
ROW_NUMBER() OVER(PARTITION BY tbl.CourseID ORDER BY tbl.CourseID) AS RowNumber,
COUNT(PaperCode) OVER(PARTITION BY tbl.CourseID, tbl.[StudentName]) AS NumberofRegistration,
CourseID,
StudentName,
PaperCode
FROM
@tbl AS tbl
)
SELECT
CTE.CourseID,
CTE.StudentName,
CTE.NumberofRegistration
FROM
CTE
WHERE
CTE.RowNumber=1
但这将在SQL Server 2012中起作用:
;WITH CTE
AS
(
SELECT
COUNT(CourseID) OVER(PARTITION BY tbl.CourseID,tbl.StudentName) AS NumberofRegistration,
tbl.CourseID,
tbl.StudentName,
tbl.PaperCode
FROM
@tbl AS tbl
)
, CTE2
AS
(
SELECT
ROW_NUMBER() OVER(PARTITION BY CTE.CourseID ORDER BY CTE.NumberofRegistration DESC) AS RowNumber,
CTE.NumberofRegistration,
CTE.CourseID,
CTE.StudentName,
CTE.PaperCode
FROM
CTE
)
SELECT
CTE2.CourseID,
CTE2.StudentName,
CTE2.NumberofRegistration
FROM
CTE2
WHERE
CTE2.RowNumber=1
结果
CourseID| StudentName | NumberofRegistration
101 David 2
102 Peter 2
为什么你期望大卫的
CourseID==101
而不是102
?这个查询有点可疑。您在SQL Server 2005/2008中获得了预期结果,但在SQL Server 2012中没有。我认为您需要将NumberofRegistration
包含在行号的orderby
中。否则,您无法确定您将实际获得NumberofRegistration
的RowNumber=1
的最大值。确定。我刚刚在SQLServer2008上进行了测试,它成功了。让我看看我是否能更新它非常感谢你的输入。您是否有任何idé为什么它在2005/2008年有效而在2012年无效?查询计划不同。在2008版中有一个额外的排序步骤。