2012-03-14 9 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 

期待される結果は、私はfollwoingクエリおよび所望の結果を達成するためにそれを拡張することができないと試み

CourseID| StudentName | NumberofRegistration 

101  David  2 
102  Peter  2 

とすることができます。 CourseID、StudentName によって 登録 グループ)から

select 

     CourseID, 
     StudentName, 
     NumberOfRegistration 
from 

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

がそれを完了するために私を助けてくださいxは。たぶん

+2

あなたは 'CourseIDの== 101を期待する理由ダビデは '102'ではない? – sll

答えて

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) 

ミカエル・エリクソンのようなクエリ

では、この問題を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 

では動作しません。しかし、これは2012年のSQL Serverで動作します:

;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では得られます。row_numberの 'order by'に' NumberofRegistration'を含める必要があると思います。さもなければ、 'RowNumber = 1'に対して' NumberofRegistration'の最高値を実際に得ることができません。 –

+0

私はSQL Server 2008でテストしたところ、うまくいきました。私がそれを更新できるかどうか見てみましょう – Arion

+0

答えを更新しました。 – Arion

関連する問題