SQL:在一列中获取最小值和最大值
Posted
技术标签:
【中文标题】SQL:在一列中获取最小值和最大值【英文标题】:SQL : get Min and Max value in one column 【发布时间】:2019-07-13 13:16:18 【问题描述】:我有一个employee
表,上面有名字和薪水。
我想打印这 2 列,其中只有 2 条记录,即我的最高和最低薪员工的姓名。
它应该看起来像这样:
Name Salary
------------------
James 800
Samanth 3000
以下代码不是我想要的,我想要 2 列中的最小值和最大值,每个值有 2 个名称
SELECT
name, MIN(salary), MAX(salary)
FROM
employee
【问题讨论】:
如果超过 1 人的最高/最低工资怎么办 好问题,我会研究它,但现在这个问题优先 【参考方案1】:您可以通过使用子查询来做到这一点:
SELECT first_name, salary FROM employees
WHERE salary IN ((SELECT MAX (salary) FROM employees), (SELECT MIN (salary) FROM employees))
【讨论】:
【参考方案2】:我终于找到了我想要的简单代码。
select emp_name, salary
from employees
where salary = (select max(salary) from employees)
union all
select emp_name, salary
from employees
where salary = (select min(salary) from employees);
我不知道联盟。 谢谢大家的贡献
【讨论】:
【参考方案3】:你可以试试这个。示例输出。
name MAX(salary) MIN(salary)
George 9200 9200
James 5000 100
Kanye 3200 3200
Nicole 4500 4500
Samanth 3000 2300
Umut 1500 250
Vladimir 2300 330
示例表值
id name salary
1 James 800
2 Samanth 3000
3 Umut 1500
4 Umut 250
5 Nicole 4500
6 George 9200
7 Kanye 3200
8 Vladimir 2300
9 Vladimir 1000
10 Vladimir 330
11 James 5000
12 James 100
13 Samanth 2300
SELECT name, MAX(salary), MIN(salary) FROM employee GROUP BY name;
【讨论】:
谢谢,但这正是我不想要的,我不想有 3 列而是 2 列【参考方案4】:如果您使用的是mysql,您可以执行以下操作
-
按薪水分组连接所有用户 1st
使用“order by limit 1”的最低工资用户列表
与步骤 2 相同,以获得最高工资
联合他们
即使超过 1 人的最高/最低工资也能解决问题
SELECT *
FROM (
SELECT group_concat(NAME) AS names ,
salary ,
'minimum' AS remarks
FROM employee
GROUP BY salary
ORDER BY salary limit 1)tmp
UNION ALL
SELECT *
FROM (
SELECT group_concat(NAME) AS names ,
salary ,
'maximum' AS remarks
FROM employee
GROUP BY salary
ORDER BY salary DESC limit 1
)tmp1
样本输出
names salary remarks
tom,jolly 10 minimum
sally 10001 maximum
【讨论】:
【参考方案5】:最佳方法取决于数据库,但以下使用标准 SQL:
select max(case when seqnum_asc = 1 then salary end) as min_salary,
max(case when seqnum_asc = 1 then name end) as min_salary_name,
max(case when seqnum_desc = 1 then salary end) as max_salary,
max(case when seqnum_desc = 1 then name end) as max_salary_name
from (select e.*,
row_number() over (order by salary asc) as seqnum_asc,
row_number() over (order by salary desc) as seqnum_desc
from employee e
) e;
【讨论】:
你能提供一个你的代码输出的示例吗?【参考方案6】:我就是这样用的。你可以这样做
DECLARE @minsalary varchar(60)
set @minsalary = (select top 1 concat(Name, ' ', salary) from employee where salary= (select min(salary) from employee)
)
DECLARE @maxsalary varchar(60)
set @maxsalary = (select top 1 concat(Name, ' ', salary) from employee where salary= (select max(salary) from employee)
)
select concat(@maxsalary, ' ', @minsalary)
【讨论】:
【参考方案7】:有很多方法可以做到这一点。这只是其中之一。如果他们具有相同的最低/最高工资,它也可能提供超过 2 条记录
声明@min int,@max int 从 YourTable 中选择 @min=min(Salary),@max=max(Salary)
SELECT Name, Salary from YourTable where Salary=@min OR Salary=@max
【讨论】:
以上是关于SQL:在一列中获取最小值和最大值的主要内容,如果未能解决你的问题,请参考以下文章