我正在处理一个 SQL 查询。
表名:
employees
.
我想在 SQL 中获取
MAX
和 MIN
sal 及其员工姓名。
我知道如何使用
MAX
或 MIN
。但我们怎样才能在一个查询中同时完成这两项任务呢?
我需要如下所示的单行输出:
e1.name AS MaxName, MAX(e1.sal) AS MaxSalary, e2.name AS MinName, MIN(e2.sal) AS MinSalary
单选:
SELECT MIN( salary ) AS MinSalary,
MIN( name ) KEEP ( DENSE_RANK FIRST ORDER BY salary ASC ) AS MinName,
MAX( Salary ) AS MaxSalary,
MAX( name ) KEEP ( DENSE_RANK LAST ORDER BY salary ASC ) AS MaxName
FROM Employees;
两种方式:
使用分析功能:
SQL> SELECT MIN(ename) KEEP (DENSE_RANK FIRST ORDER BY sal) min_name,
2 MIN(sal) AS min_sal,
3 MAX(ename) KEEP (DENSE_RANK LAST ORDER BY sal) AS max_name,
4 MAX(sal) AS max_sal
5 FROM emp;
MIN_NAME MIN_SAL MAX_NAME MAX_SAL
---------- ---------- ---------- ----------
SMITH 800 KING 5000
使用内联视图:
SQL> WITH DATA AS
2 ( SELECT MIN(sal) min_sal, MAX(sal) max_sal FROM emp
3 )
4 SELECT
5 (SELECT e.ename FROM DATA t, emp e WHERE e.sal = t.min_sal AND ROWNUM =1
6 ) min_name,
7 (SELECT t.min_sal FROM DATA t, emp e WHERE e.sal = t.min_sal AND ROWNUM =1
8 ) min_sal,
9 (SELECT e.ename FROM DATA t, emp e WHERE e.sal = t.max_sal AND ROWNUM =1
10 ) max_name,
11 (SELECT t.max_sal FROM DATA t, emp e WHERE e.sal = t.max_sal AND ROWNUM =1
12 ) max_sal
13 FROM dual;
MIN_NAME MIN_SAL MAX_NAME MAX_SAL
---------- ---------- ---------- ----------
SMITH 800 KING 5000
假设您正在使用 Oracle,请尝试此操作。首先,我们按升序和降序获取行号,然后进行交叉连接。
with employee(id,name,sal) as
(select 1,'a',1000 from dual union all
select 3,'c',1500 from dual union all
select 2,'b',2000 from dual) --temp table to recreate the scenario
, enew as(
select e.*,row_number() over (order by sal) as salasc,row_number() over (order by sal desc) as saldesc from employee e
) --temp table to find the rownumber in ascending and descending order
--original query
select * from (select id as minsalid,name as minsalempname,sal as minsal from enew
where salasc=1)
cross join
(select id as maxsalemp,name as maxsalempname,sal as maxsal from enew
where saldesc=1)
以下解决方案适用于 MySQL,这是您发布问题时最初拥有的标签之一。
您可以针对自身执行
CROSS JOIN
表的 employees
,以通过查找最小姓名/薪水的查询来查找最大姓名/薪水。
SELECT e1.name AS MaxName, MAX(e1.sal) AS MaxSalary,
e2.name AS MinName, MIN(e2.sal) AS MinSalary
FROM employees e1 CROSS JOIN employees e2
单击下面的链接查看正在运行的演示。我实际上包含了姓名/工资对,但如果您不希望这些姓名出现,您可以将其删除。
尝试类似:
select max(sal), min(sal), employee_id
from employees
group by employee_id;
之后你就可以加入它来获取名字了。也许您也可以按名称和 ID 进行分组。
with min_max_age as
(
select dept,
min(age) as min_Age,
max(age) as max_age
from Employees
group by dept
)
select a.name, a.dept, a.age from Employees a join min_max_age b
on (a.age = b.min_Age and a.dept = b.dept)
or (a.age = b.max_age and a.dept = b.dept)