oracle - Oracle 分析函数与 group by
问题描述
通常我们按部门名称进行分组并找到最高和最低工资。
select dept_name,sum(salary),max(salary).min(salary) from emp group by dept_name;
但是我怎样才能找到获得最高薪水和最低薪水的员工的姓名。是否可以在单个 sql 语句中找到?
解决方案
您可以使用FIRST功能:
SELECT dept_name, SUM(salary), MAX(salary), MIN(salary),
MAX(emp_name) KEEP (DENSE_RANK FIRST ORDER BY salary) AS Min_salary_emp,
MAX(emp_name) KEEP (DENSE_RANK LAST ORDER BY salary) as Max_salary_emp
FROM emp
GROUP BY dept_name;
请注意,如果您有不止一名员工具有相同的薪水,您只会得到其中一名。
根据您的要求,您还可以使用模式匹配
SELECT dept_name, MAX_salary, MIN_salary, salary, emp_name,
Min_salary_emp, Max_salary_emp
FROM emp
MATCH_RECOGNIZE (
PARTITION BY dept_name
ORDER BY salary
MEASURES
FINAL MIN(salary) AS MIN_salary,
FINAL MAX(salary) AS MAX_salary,
a.emp_name AS Min_salary_emp,
c.emp_name AS Max_salary_emp
ALL ROWS PER MATCH
PATTERN ( (a+ {- b* -} c+) | a )
DEFINE
a AS salary = MIN(salary),
c AS salary = MAX(salary)
);
推荐阅读
- vba - 如何检查范围是否包含唯一值?
- java - 批量大小不适用于 Google Guice + JPA + Hibernate
- android-studio - Android Studio:如何将代码包装在括号中
- javascript - 除了 javascript 线程之外,哪些浏览器运行 css 动画?
- netsuite - 保存时 Netsuite 高级 PDF 模板问题
- docker - 如何将多步 docker 更改为一步 docker build?
- c# - C# Winforms 从注册表中获取 int 值
- json - 从 dart 中的嵌套 Map 中获取字符串
- ios - 当某些 UIStackView 的子视图未隐藏时,UITableViewCell 不会改变高度
- angular - 如何将 *ngIf 值从一个组件传递到另一个组件?