SQL 是作为开发工程师、数据工程师必须要深入掌握的一项技能。我也一直在提升这部分的能力,从入门到精通。除了阅读一些 SQL 经典书籍,刷题也是一个不错的选择。于是,我将做过的题目与解法,汇总到这里,和大家一起学习。
SQL 练习题系列和「体验碎片」系列一样,会不定期进行更新。
第一道题:写一条 SQL 查询语句,从 customer 表中查询购买了 product 表中所有产品的客户的 id。
解法:
1.对每个客户购买的产品分组聚合,有的客户可能多次购买一个产品,因此需要对 product_key 去重;2.题目要求是取出购买了所有产品的客户,对产品表的产品计数;3.客户购买的产品数量刚好等于 product 表中所有产品数量。
select customer_id from Customer group by customer_id having count(distinct product_key ) = (select count( *) from Product)
第二道题:写一段 SQL 来查找在 2019-08-16 时全部产品的价格,假设所有产品在修改前的价格都是 10。
思路:
1.先在 product 表中找出全部产品在change_date为 "2019-08-16"当天以及之前最近一次的new_price。
(select product_id, new_pricefrom (select product_id, new_price, row_number()over(partition by product_id order by change_date desc) as rkfrom Productswhere change_date <= "2019-08-16" )rwhere r.rk = 1
2.将产品表作为主表,对其所有产品去重,作为表 a,使用 left join 连接 b 表,得到 new_price,如果 a 表有的产品没有在"2019-08-16"之前没有修改,则 new_price 则为 null 值,设置价格为 10,使用 ifnull 公式,如果 b.new_price 值为空,则赋值为 10。
select a.product_id,ifnull(b.new_price,10) as pricefrom (select distinct product_idfrom Products ) aleft join (select product_id, new_pricefrom (select product_id, new_price, row_number()over(partition by product_id order by change_date desc) as rkfrom Productswhere change_date <= "2019-08-16") r where r.rk = 1) b on a.product_id = b.product_id
![54680c1c84ca928314f4cac0b4dfc1db.png](https://i-blog.csdnimg.cn/blog_migrate/9afb249febaa9016b57176cd40585771.png)