SQL211
题目链接:SQL211题目链接
题目总结:
窗口函数的进一步认识:
使用这道题目里面的窗口函数的例子来说明:
dense_rank() OVER (
PARTITION BY dept_no -- 按部门分组
ORDER BY salary DESC -- 按薪资降序排序
) AS rk -- 为排名结果命名为 rk
这里面的dense_rank()就是并列排名
OVER 子句:定义窗口范围。
与此相关的排名函数的对比:
| 函数名 | 相同值处理方式 | 排名是否跳跃? | 示例(薪资:100, 100, 80, 70) |
|---|---|---|---|
ROW_NUMBER() |
分配唯一连续排名 | 是(1, 2, 3, 4) | 1, 2, 3, 4 |
RANK() |
相同值相同排名 | 是(1, 1, 3, 4) | 1, 1, 3, 4 |
DENSE_RANK() |
相同值相同排名 | 否(1, 1, 2, 3) | 1, 1, 2, 3 |
解题SQl代码:
select dept_no,
emp_no,
salary
from
(
select
de.dept_no,
de.emp_no,
s.salary,
dense_rank() over(partition by dept_no order by salary desc ) as rk
from dept_emp de
join salaries s on de.emp_no=s.emp_no
)A
where rk=1
order by dept_no
SQL215
题目链接:SQL215题目链接
题目总结:
认识了窗口函数里面的AVG函数
窗口函数的五种类型:
-
排名函数
-
分布函数(即计算当前行占总比例的多少)
-
聚合函数(作为窗口函数使用):常见的聚合函数(如
SUM、AVG、MIN、MAX、COUNT)可以在窗口函数中使用,用于计算分组内的聚合值 -
偏移函数(用于访问当前行偏移offset后的数据)
-
其他窗口函数
SQL代码
select distinct t.title,
AVG(s.salary) over(partition by title) as sk
from titles t
join salaries s on t.emp_no=s.emp_no
order by sk
官方题解代码
select t.title,
AVG(s.salary) as salary
from titles t
join salaries s on t.emp_no=s.emp_no
group by t.title
order by salary
重新复习了一下group子句:
Tips:group by子句是搭配聚合函数使用的,但是在select字段里面的没有参与聚合函数的必须写到group by子句里面,不然sql语句会报错。
posted on
浙公网安备 33010602011771号