有一个薪水表salaries简况如下: emp_no salary from_date to_date 10001 88958 2002-06-22 9999-01-01 10002 72527 2001-08-02 9999-01-01 10003 43311 2001-12-01 9999-01-01 10004 72527 2001-12-01 9999-01-01 对所有员工的薪水按照salary降序先进行1-N的排名,如果salary相同,再按照emp_no升序排列: emp_no salary t_rank 10001 88958 1 10002 72527 2 10004 72527 2 10003 43311 3
时间: 2023-06-12 09:08:09 浏览: 63
可以使用以下 SQL 语句来实现对所有员工的薪水按照 salary 降序先进行 1-N 的排名,如果 salary 相同,再按照 emp_no 升序排列:
```
SELECT emp_no, salary,
DENSE_RANK() OVER (ORDER BY salary DESC, emp_no) AS t_rank
FROM salaries;
```
其中,DENSE_RANK() 函数用于计算分组中每个行的排名,排名相同的行具有相同的排名值,并且会略过相邻排名。OVER 子句用于指定排序规则。在本例中,按照 salary 降序排序,如果 salary 相同,则按照 emp_no 升序排序。
相关问题
有一个全部员工的薪水表salaries简况如下: emp_no salary from_date to_date 10001 88958 2002-06-22 9999-01-01 10002 72527 2001-08-02 9999-01-01 10003 43311 2001-12-01 9999-01-01 有一个各个部门的领导表dept_manager简况如下: dept_no emp_no to_date d001 10001 9999-01-01 d002 10003 9999-01-01 请你查找各个部门当前领导的薪水详情以及其对应部门编号dept_no,输出结果以salaries.emp_no升序排序,并且请注意输出结果里面dept_no列是最后一列,以上例子输出如下: emp_no salary from_date to_date dept_no 10001 88958 2002-06-22 9999-01-01 d001 10003 43311 2001-12-01 9999-01-01 d002
以下是查询语句:
```
SELECT s.emp_no, s.salary, s.from_date, s.to_date, dm.dept_no
FROM salaries s
JOIN dept_manager dm ON s.emp_no = dm.emp_no AND dm.to_date = '9999-01-01'
ORDER BY s.emp_no ASC;
```
解析:
1. 使用 JOIN 连接 salaries 和 dept_manager 表,在两个表的 emp_no 列匹配的情况下。
2. 添加额外的限制条件 dm.to_date = '9999-01-01',以确保只选择当前领导。
3. 选择需要的列,并按照 emp_no 升序排序。
输出结果应该如下:
```
emp_no | salary | from_date | to_date | dept_no
---------+-----------+------------+------------+--------
10001 | 88958 | 2002-06-22 | 9999-01-01 | d001
10003 | 43311 | 2001-12-01 | 9999-01-01 | d002
```
有一个薪水表salaries简况如下: emp_no salary from_date to_date 10001 88958 2002-06-22 9999-01-01 10002 72527 2001-08-02 9999-01-01 10003 43311 2001-12-01 9999-01-01 10004 72527 2001-12-01 9999-01-01 对所有员工的薪水按照salary降序先进行1-N的排名,如果salary相同,再按照emp_no升序排列,但t_rank一样: emp_no salary t_rank 10001 88958 1 10002 72527 2 10004 72527 2 10003 43311 3
可以使用MySQL的DENSE_RANK()函数来实现按照salary进行排名,如果salary相同再按照emp_no进行排序。具体的SQL语句如下:
```
SELECT emp_no, salary, DENSE_RANK() OVER (ORDER BY salary DESC, emp_no) AS t_rank
FROM salaries;
```
其中,DENSE_RANK()函数会根据指定的排序规则,返回一个密集排名,即如果出现相同的排序值,会跳过相同的排名,即不会出现1,2,2,4这种排名。ORDER BY子句中指定了按照salary降序排列,如果salary相同再按照emp_no升序排列。最终的结果会包含emp_no、salary和t_rank三个列,其中t_rank就是按照指定规则排名后的结果。
阅读全文