Sql 需要为需要GROUPBY子句的查询选择不同的列
我有一个Student表,其中包含以下列: studentName、startYear、EndYear、classId和其他一些列 此表包含不同班级学生的起始年和结束年 我想写一个查询来查找所有学生的名字,这些学生用了最长的年数来通过一门课 在select查询中我需要以下三个字段Sql 需要为需要GROUPBY子句的查询选择不同的列,sql,sql-server,Sql,Sql Server,我有一个Student表,其中包含以下列: studentName、startYear、EndYear、classId和其他一些列 此表包含不同班级学生的起始年和结束年 我想写一个查询来查找所有学生的名字,这些学生用了最长的年数来通过一门课 在select查询中我需要以下三个字段 select studentName, classId, max(EndYear- startYear) as maxYears from Students group by classId; 但由于group b
select studentName, classId, max(EndYear- startYear) as maxYears from Students group by classId;
但由于group by不包含studentname,因此此查询失败,也有意义
然后我可以做:
将以下查询的结果放入临时表temp中:
select classId, max(EndYear- startYear) from Students group by classId
然后将此临时表与学生表联接
select studentName, classId, EndYear- startYear from Student s join Temp t on s.classId = t.classId and (s.EndYear- s.startYear) = t.maxYears
但这对我来说并不理想。我想知道还有什么其他方法可以做到这一点。以下带有相关子查询的脚本应该相当于连接解决方案,甚至可以由SQL Server优化器转换为连接
SELECT studentName, classId
FROM Students s
WHERE (EndYear- startYear) = (SELECT MAX(EndYear- startYear)
FROM Students sm
WHERE c.classId = sm.classId)
尝试此查询,该查询执行自联接以获取具有最大EndYear-startYear的行:
select s1.studentName, s1.classId, s1.EndYear-s1.startYear
from Student s1
inner join
(
select classId, max(EndYear- startYear)
from Students
group by classId
) s2
on s1.classId = s2.classId;
试试这个:
SELECT *
FROM (
SELECT studentName, startYear, EndYear, classId,
DENSE_RANK() OVER(PARTITION BY classId ORDER BY endYear - startYear DESC) AS Rnk
FROM dbo.Student
) x
WHERE x.Rnk = 1;
如果您在问题中添加一些示例输入和输出数据,可能会有助于澄清需求。现在有点模糊。这不可编译,因为EndYear和startYear在子句中无效,因为EndYear和startYear不属于任何聚合函数或group by子句db:SQL server@Ashish-你说得对。很抱歉。将更改查询。排名不是更好吗?这应该包括超过1名学生达到每班最大值的情况。@PM77-1:如果使用行数,则可能会出现此问题,但此解决方案使用密集列。在Rnk=1的特殊情况下,稠密秩和秩将给出相同的结果。