Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.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
返回多个值的Max函数[SQL]_Sql_Oracle_Function_Max - Fatal编程技术网

返回多个值的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学习。回答得好<代码>保留。美好的