力扣SQL刷题8

1212. 查询球队积分

题型:读题
解答:先考虑做主方时,再考虑客方时
在这里插入图片描述
在这里插入图片描述

SELECT t.team_id, t.team_name, IFNULL(score,0) num_points
FROM
(
    SELECT team_id, SUM(score) score
    FROM (
        SELECT host_team team_id, 
        SUM(CASE
        WHEN host_goals>guest_goals THEN 3
        WHEN host_goals<guest_goals THEN 0
        ELSE 1
        END) score
        FROM matches
        GROUP BY host_team
        UNION ALL
        SELECT guest_team team_id, 
        SUM(CASE
        WHEN host_goals>guest_goals THEN 0
        WHEN host_goals<guest_goals THEN 3
        ELSE 1
        END) score
        FROM matches
        GROUP BY guest_team
    ) b
    GROUP BY team_id
) a
RIGHT JOIN teams t ON t.team_id=a.team_id
ORDER BY num_points DESC, t.team_id

1270. 向公司CEO汇报工作的所有人

题型:看题,嵌套
解题:幸好题目限定了不超过三次,三次自连接就可以了
在这里插入图片描述

select e1.employee_id 
from Employees e1 , Employees e2 ,Employees e3 
where e1.manager_id = e2.employee_id and  e2.manager_id = e3.employee_id
and e3.manager_id =1 and e1.employee_id !=1

1285. 找到连续区间的开始和结束数字

题型:看题目
解答:和求连续N天思路差不多。
先排序 — 日期减去排序序号 — 对减出来的差做分组 — 最大值和最小值即我们所求
在这里插入图片描述
在这里插入图片描述

select min(log_id) start_id,max(log_id) end_id
from
(select log_id ,rank()over(order by log_id asc) as rk
from Logs) a
group by (log_id-rk)

注意点:select 。。。from (select。。。) a
一定要取一个别名a,不然会报错

1321. 餐馆营业额变化增长–重要

题型:读题
解答:1,先按照每天的累计好,2,再计算7天累计的
在这里插入图片描述
在这里插入图片描述

SELECT DISTINCT visited_on,
       sum_amount AS amount, 
       ROUND(sum_amount/7, 2) AS average_amount
-- 需要先求出和后除以7,且要加最后的where条件,所以又嵌套了一次
FROM (
    SELECT visited_on, 
       SUM(amount) OVER ( ORDER BY visited_on ROWS 6 PRECEDING ) AS sum_amount
    -- 以下是先计算出每天的金额总量
    FROM (
        SELECT visited_on, 
            SUM(amount) AS amount
        FROM Customer
        GROUP BY visited_on
         ) TT
     ) LL
-- 最后手动只要覆盖完整7天的数据
WHERE DATEDIFF(visited_on, (SELECT MIN(visited_on) FROM Customer)) >= 6
#输出结果的日期要离最早的那天,至少隔了7天
#DATEDIFF(visited_on, MIN(visited_on) ) >= 6 注意这样不行
窗口函数知识点补充

窗口函数写法:

[你要的操作] OVER ( PARTITION BY  <用于分组的列名>
                    ORDER BY <按序叠加的列名> 
                    ROWS <窗口滑动的数据范围> )

滑动数据范围:

当前行 - current row
之前的行 - preceding
之后的行 - following
无界限 - unbounded
表示从前面的起点 - unbounded preceding
表示到后面的终点 - unbounded following

举例:

取当前行和前五行:ROWS between 5 preceding and current row --共6行
取当前行和后五行:ROWS between current row and 5 following --共6行
取前五行和后五行:ROWS between 5 preceding and 5 folowing --共11行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值