返回多个值的Max函数[SQL]
我有三张桌子:钱、学生、教员。此查询返回每个教员及其最高津贴返回多个值的Max函数[SQL],sql,oracle,function,max,Sql,Oracle,Function,Max,我有三张桌子:钱、学生、教员。此查询返回每个教员及其最高津贴 select f.name as "FACULTY_NAME", max(stipend) as "MAX_STIPEND" from money m, student s inner join faculty f on f.id_faculty = s.faculty_id where m.student_id = s.id_student group by f.id_fac
select
f.name as "FACULTY_NAME",
max(stipend) as "MAX_STIPEND"
from
money m, student s
inner join
faculty f on f.id_faculty = s.faculty_id
where
m.student_id = s.id_student
group by
f.id_faculty, f.name;
查询工作正常:
FACULTY_NAME | MAX_STIPEND
-----------------+---------------
IT Faculty | 50
Architecture | 60
Journalism | 40
然而,当我将s.name添加到原始查询中以同时显示收到最高助学金的学生的姓名时,查询的工作方式与以前不同-它返回所有学生
select
f.name as "FACULTY_NAME",s.name,
max(stipend) as "MAX_STIPEND"
from
money m, student s
inner join
faculty f on f.id_faculty = s.faculty_id
where
m.student_id = s.id_student
group by
f.id_faculty, f.name, s.name;
查询结果:
FACULTY_NAME | s.name | MAX_STIPEND
----------------+-----------+---------------
IT Faculty | Joe | 50
IT Faculty | Lisa | 10
Architecture | Bob | 60
Journalism | Fred | 5
Architecture | Susan | 5
Journalism | Tom | 40
它使用右连接、左连接和内连接执行相同的操作。有人能说出问题出在哪里吗
然而,当我将s.name添加到原始查询中以同时显示收到最高助学金的学生的姓名时,查询的工作方式与以前不同-它返回所有学生
select
f.name as "FACULTY_NAME",s.name,
max(stipend) as "MAX_STIPEND"
from
money m, student s
inner join
faculty f on f.id_faculty = s.faculty_id
where
m.student_id = s.id_student
group by
f.id_faculty, f.name, s.name;
添加s.name
时,您正在查找每个用户的最小值
如果您想知道拥有MAX_-inspend
津贴的用户的姓名,您应该转到窗口函数。例如,在MS SQL Server中
with cte as
(select
f.name as "FACULTY_NAME",
s.name as "STUDENT_NAME",
stipend as "MAX_STIPEND",
DENSE_RANK() OVER
(PARTITION BY f.name, s.name ORDER BY i.stipend DESC) AS Rank
from
money m
inner join student s on m.student_id = s.id_student
inner join
faculty f on f.id_faculty = s.faculty_id
)
select "FACULTY_NAME", "STUDENT_NAME"
from cte
where rank = 1
并非所有sql品牌都有窗口函数。这里是的链接,也是首先,您应该为所有联接使用正确的
JOIN
语法
其次,您可以使用Oracle的keep
语法:
select f.name as FACULTY_NAME,
max(stipend) as MAX_STIPEND,
max(s.name) keep (dense_rank first order by stipend desc)
from money m join
student s
on m.student_id = s.id_student join
faculty f
on f.id_faculty = s.faculty_id
group by f.id_faculty, f.name;
首先,选择一种连接语法并坚持使用它。最好是使用JOIN关键字的。左对齐SQL太难阅读了。您通常按照所选的列进行分组,除了那些作为设置函数参数的列。您使用的是哪种rdbms?我使用oracle SQPLUSLL time向您@gordonLinoff学习。回答得好<代码>保留。美好的