Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 使用行号()-查找最大注册数_Sql Server 2005_Tsql - Fatal编程技术网

Sql server 2005 使用行号()-查找最大注册数

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

我想使用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 | 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版中有一个额外的
排序步骤。