2012-03-14 92 views
2

我想找出使用​​ROW_NUMBER()函數在每門課程的最大試卷註冊。使用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 

我試圖與follwoing查詢,無法進行擴展,以達到預期的效果。

select 

     CourseID, 
     StudentName, 
     NumberOfRegistration 
from 

(
    select 
     CourseID, 
     StudentName, 
     ROW_NUMBER() 
     over( 
       partition by count(papercode) 
       order by CourseID asc) as NumberOfRegistration 

從 註冊 通過CourseID,StudentName 組)×

請幫我完成它。

+2

爲什麼你期待'CourseID == 101大衛不是'102'嗎? – sll 2012-03-14 07:28:52

回答

3
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 
3

也許是這樣的:

測試數據

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埃裏克森說,這將在SQL Server 2005/2008工作。但它不會在SQL Server 2012中

;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 
+0

這個查詢有一些可疑的事情發生。你得到預期的結果在SQL Server 2005/2008,但不能在SQL Server 2012中,我認爲你需要包括'NumberofRegistration'在'爲了by'for的ROW_NUMBER。否則,您無法確定您是否實際獲得了「RowNumber = 1」的「NumberofRegistration」的最高值。 – 2012-03-14 08:10:46

+0

好的。我剛剛在SQL Server 2008上測試過,它工作。讓我看看我是否可以更新它 – Arion 2012-03-14 08:31:15

+0

更新了答案。 – Arion 2012-03-14 08:37:45