SQL - 获取行的 MIN 值并检查此 MIN 值是不是在行中至少 2 次
Posted
技术标签:
【中文标题】SQL - 获取行的 MIN 值并检查此 MIN 值是不是在行中至少 2 次【英文标题】:SQL - get MIN value of row and check this MIN value to be in row at least 2 timesSQL - 获取行的 MIN 值并检查此 MIN 值是否在行中至少 2 次 【发布时间】:2020-07-28 21:01:54 【问题描述】:我想要实现的是: 1) 获取表中每个部门工资的最小值。 2) 如果对于每个部门,该最小值在表中至少存在两次次,则显示其部门ID。
例子:
column1 name salary department_id
id1 John1 10000 1
id2 John2 10000 1
id3 John3 30000 2
id4 John4 30000 2
id5 John5 50000 3
id6 John6 20000 4
结果:
department_id
1
2
【问题讨论】:
同时指定预期结果。 请向我们展示您对此样本数据的预期结果。 【参考方案1】:如果我没听错的话,你会想要一个以上员工工资最低的部门。
这是一种使用窗口函数的方法,通过比较row_number()
和rank()
来工作:
select distinct department_id
from (
select
t.*,
row_number() over(partition by department_id order by salary) rn,
rank() over(partition by department_id order by salary) rnk
from mytable t
) t
where rnk = 1 and rn > 1
【讨论】:
【参考方案2】:如果我理解正确,您希望最低工资至少出现两次的部门。这让我想到了窗口函数:
select t.department_id
from (select t.*,
count(*) over (partition by department_id, salary) as cnt,
row_number() over (partition by department_id order by salary) as seqnum
from t
) t
where seqnum = 1 and cnt > 1;
请注意,您不需要select distinct
,因为这会为每个部门选择最多一行。
【讨论】:
【参考方案3】: SELECT department_id
FROM Employee
WHERE Employee.salary = (select min(emp.salary) from Employee emp where emp.department_id = Employee.department_id)
GROUP BY department_id
HAVING COUNT(1) >=2
【讨论】:
以上是关于SQL - 获取行的 MIN 值并检查此 MIN 值是不是在行中至少 2 次的主要内容,如果未能解决你的问题,请参考以下文章
如何在 oracle sql 中再次使用 MAX 和 MIN 函数获取值?
SQL: first_value(), 获取视频的 min_date
返回 MIN 和 MAX 值并忽略空值 - 使用前面的非空值填充空值