Tsql Transact-SQL查找每个组中的最大注册数

Tsql Transact-SQL查找每个组中的最大注册数,tsql,sql-server-2000,Tsql,Sql Server 2000,大家早上好 我有一个表结构(我使用的是SQL SERVER 2000) CourseID StudentName术语PaperID 我想列出课程ID、学生姓名、每门课程的最大注册人数 我尝试了以下查询 select CourseId, StudentName, max(x.numberofregistration) as max_registration from ( select CourseID, StudentName,

大家早上好

我有一个表结构(我使用的是SQL SERVER 2000)

CourseID StudentName术语PaperID

我想列出课程ID、学生姓名、每门课程的最大注册人数

我尝试了以下查询

select 
CourseId,
StudentName,
max(x.numberofregistration) as max_registration
from
(
   select 
           CourseID,
           StudentName,
           count(CourseID) as numberofregistration 
    from 
    dbo.Students 
            group by CourseId,StudentName
 )x
 group by CourseId,StudentName
但它没有给出预期的结果

预期的结果是 我有一个桌子结构

CourseID学生姓名最大注册


如何达到预期的效果?提前谢谢。

这里有一个非常非常丑陋的方式。我想我宁愿付升级费,也不愿写太多这样的东西。希望其他人能想出更干净的东西

CREATE TABLE #x(CourseID INT, StudentName VARCHAR(32), TermPaperID INT);

INSERT #x SELECT 101,'Jon   ',1;   
INSERT #x SELECT 101,'Jon   ',2;
INSERT #x SELECT 101,'Jon   ',3;
INSERT #x SELECT 101,'David ',1;   
INSERT #x SELECT 101,'David ',2;
INSERT #x SELECT 102,'David ',5; 
INSERT #x SELECT 102,'David ',6; 
INSERT #x SELECT 102,'George',5;

SELECT b.CourseID, b.StudentName, max_registration = COUNT(*)
FROM #x AS b
INNER JOIN (
  SELECT CourseID, c = MAX(c)
  FROM
  (
    SELECT CourseID, StudentName, c = COUNT(CourseID) 
    FROM #x GROUP BY CourseID, StudentName
  ) AS x GROUP BY CourseID
) AS s
ON b.CourseID = s.CourseID
GROUP BY b.CourseID, b.StudentName
HAVING COUNT(*) = MAX(s.c)
ORDER BY b.CourseID;

您的CTE“x”似乎按与您正在计数的CTE相同的值进行分组。仅仅计算一个不同的字段(即学期论文id)就可以得到预期的结果


也就是说,在你想要的结果样本中,我不清楚为什么这些结果是来自样本数据的预期结果。如果我误解了这个问题,我很乐意再试一次!:-)

SQL Server 2000?我为你感到难过,但为什么呢?如果有另一排:“102,乔治,5”你认为这会对结果产生什么影响?非常感谢你花时间指导我。我确实同意使用row_number()和Partition我们可以很容易地解决这个问题,但我正在处理客户端项目,其中他们仍然使用SQL Server 2000。
101         Jon            3   
102         David          2
CREATE TABLE #x(CourseID INT, StudentName VARCHAR(32), TermPaperID INT);

INSERT #x SELECT 101,'Jon   ',1;   
INSERT #x SELECT 101,'Jon   ',2;
INSERT #x SELECT 101,'Jon   ',3;
INSERT #x SELECT 101,'David ',1;   
INSERT #x SELECT 101,'David ',2;
INSERT #x SELECT 102,'David ',5; 
INSERT #x SELECT 102,'David ',6; 
INSERT #x SELECT 102,'George',5;

SELECT b.CourseID, b.StudentName, max_registration = COUNT(*)
FROM #x AS b
INNER JOIN (
  SELECT CourseID, c = MAX(c)
  FROM
  (
    SELECT CourseID, StudentName, c = COUNT(CourseID) 
    FROM #x GROUP BY CourseID, StudentName
  ) AS x GROUP BY CourseID
) AS s
ON b.CourseID = s.CourseID
GROUP BY b.CourseID, b.StudentName
HAVING COUNT(*) = MAX(s.c)
ORDER BY b.CourseID;