использование Row_Number () - поиск максимальной регистрации - PullRequest
2 голосов
/ 14 марта 2012

Я бы хотел узнать максимальное количество экзаменационных работ на каждом курсе, используя функцию 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 ) Х

Пожалуйста, помогите мне завершить его.

Ответы [ 2 ]

3 голосов
/ 14 марта 2012

Может быть, что-то вроде этого:

Данные испытаний

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

Но это будет работать в 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 
3 голосов
/ 14 марта 2012
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...