我是一位SQL新手,仍在尝试了解MySQL和SQL Server之间的语法差异。我最近在MySQL上解决了这个问题,但在SQL Server上却看起来完全不同,我无法在这里使用它。
我想在查询中建立一个排名列。我有一个表EnrollmentX
,其中有两列,一个唯一的StudentID
和一个GroupId
(组1:3)。我需要同时计算这三个组中每一个的学生数量,然后按学生数量对这些组进行排名。
最终结果应如下所示:
GroupId / StudentCnt / Rank
2 / 20 / 1
...对于所有三个组,依此类推。但是,尽管我的大多数语法已在My SQL和SQL Server之间工作,但这引起了SQL Server的各种问题,尤其是在调用变量的方式与以前不同的情况下。
如何在SQL Server中解决此问题?
答案 0 :(得分:1)
您可以这样做:
但是,如果该小组的学生人数相同,您不会写什么?那他们应该排名相等吗?
create table #test
(
groupid int, students int)
insert into #test
values
(1,10),
(1,14),
(2,10),
(2,5),
(2,5),
(4,40),
(5,25)
Select groupid,studentcnt ,rank() over(order by studentcnt) as rank from (
select groupid,sum(students) as StudentCnt from #test
group by groupid
)x
drop table #test
结果
答案 1 :(得分:1)
您可以根据需要使用RANK或DENSE_RANK
请注意,当总数相符时,排名列中的下一个数字将在两者之间有何不同
DECLARE @t TABLE ( StudentId int, GroupId INT)
INSERT INTO @t
VALUES(1, 1),(2, 2),(3, 2),(4, 2),(5, 3),(6, 3),(7, 3),(8, 3),(9, 2)
SELECT
GroupId
,StudentCnt = COUNT(StudentId)
,[Rank] = RANK()OVER(ORDER BY COUNT(StudentId) DESC)
,[DENSE_RANK] = DENSE_RANK()OVER(ORDER BY COUNT(StudentId) DESC)
FROM @t
GROUP BY
GroupId
输出
GroupId StudentCnt Rank DENSE_RANK
2 4 1 1
3 4 1 1
1 1 3 2 --<< this row