sql基础day06

以下题目均来自leetcode官网
本文仅用于记录学习进度

1、 1164. 指定日期的产品价格

#写一段 SQL来查找在 2019-08-16 时全部产品的价格,假设所有产品在修改前的价格都是 10 。
# 以 任意顺序 返回结果表。
#分成2部分。把第一次change_date在2019-08-16之后的单独分出来,这部分的price肯定是10,因为初始值是10。
#剩下的作为另外一部分,然后两部分做union。 另外一部分中,选出在2019-08-16之前最大的那天的price作为最终price就行了。
select product_id, '10' as new_price, change_date
from products
group by product_id
having min(change_date) > '2019-08-16'
union all
select *
from products
where (product_id, change_date) in (
    select product_id, max(change_date)
    from products
    where change_date <= '2019-08-16'
    group by product_id
)
;

2 603. 连续空余座位

#编写一个SQL查询来报告电影院所有连续可用的座位
#返回按 seat_id 升序排序 的结果表。
#思路:要找连续的三个数,那么找第二个数 他的id 和 前一个或者后一个数的 id 的差绝对值为 1
#根据此思路 可以将表自连接 以id差的绝对值为连接条件,并且free = 1
select distinct(c1.seat_id)
from cinema c1
         join cinema c2
              on abs(c2.seat_id - c1.seat_id) = 1
where c1.free = 1
  and c2.free = 1
order by c1.seat_id

3、1731 每位经理下属员工的数量

# 1731. 每位经理的下属员工数量
# 编写SQL查询需要听取汇报的所有经理的ID、名称、直接向该经理汇报的员工人数,以及这些员工的平均年龄,其中该平均年龄需要四舍五入到最接近的整数。
# 返回的结果集需要按照 employee_id 进行排序。
select e1.reports_to employee_id, e2.name name, count(*) reports_count, round(avg(e1.age), 0) average_age
from employees e1,
     employees e2
where e1.reports_to = e2.employee_id
group by e1.reports_to
order by employee_id

4、1747. 应该被禁止的 Leetflex 账户

# 编写一个SQL查询语句,查找那些应该被禁止的Leetflex帐户编号 account_id 。
# 如果某个帐户在某一时刻从两个不同的网络地址登录了,则这个帐户应该被禁止
# 思路 :如果 同一用户的不同ip 出现了login 或者logout 在 另外一条的 login和logout之间的情况
select distinct l1.account_id
from loginfo l1,
     loginfo l2
where l1.account_id = l2.account_id and l1.ip_address != l2.ip_address
    and (l1.login between l2.login and l2.logout
   or l1.logout between l2.login and l2.logout)

5、181. 超过经理收入的员工

select e2.name
from employee e1 ,employee e2 
where e1.id = e2.managerId and e2.salary > e1.salary;

6、1459、矩形面积

# 写一个 SQL 语句,报告由表中任意两点可以形成的所有 边与坐标轴平行 且 面积不为零 的矩形。
# 结果表中的每一行包含三列 (p1, p2, area) 如下:
# p1 和 p2 是矩形两个对角的 id
# 矩形的面积由列 area 表示
# 请按照面积 area 大小降序排列;如果面积相同的话, 则按照 p1 升序排序;若仍相同,则按 p2 升序排列。

# 思路:只要两点的 x 值 并且 y 值 不相等就能构成 矩形,面积等于 x的差 * y的差
select p1.id                                                       p1,
       p2.id                                                       p2,
       abs(p1.x_value - p2.x_value) * abs(p1.y_value - p2.y_value) area
from Points p1,
     Points p2
where p1.id < p2.id #重点:如果没有这个条件那么就会有多个面积相同的数据,并且无法去重
  and p1.x_value != p2.x_value
  and p1.y_value != p2.y_value
order by 3 desc, 1, 2;

7、180、连续出现的数字

做到第603题后再回来做这道题有的思路: 连续三条一样,那么我们就去找出第二条的连接条件,然后根据id分组 找出大于等于两条的即可

select distinct l1.num ConsecutiveNums
from logs l1 left join logs l2
on l1.num = l2.num and abs(l1.id-l2.id) = 1
group by l1.id
having count(l1.id) >= 2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值