Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 需要为需要GROUPBY子句的查询选择不同的列_Sql_Sql Server - Fatal编程技术网

Sql 需要为需要GROUPBY子句的查询选择不同的列

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

我有一个Student表,其中包含以下列:

studentName、startYear、EndYear、classId和其他一些列

此表包含不同班级学生的起始年和结束年

我想写一个查询来查找所有学生的名字,这些学生用了最长的年数来通过一门课

在select查询中我需要以下三个字段

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的特殊情况下,稠密秩和秩将给出相同的结果。