- 学习:知识的初次邂逅
- 复习:知识的温故知新
- 练习:知识的实践应用
目录
一,原题力扣链接
二,题干
表:
Users
+----------------+---------+ | Column Name | Type | +----------------+---------+ | user_id | int | | join_date | date | | favorite_brand | varchar | +----------------+---------+ user_id 是此表主键(具有唯一值的列)。 表中描述了购物网站的用户信息,用户可以在此网站上进行商品买卖。表:
Orders
+---------------+---------+ | Column Name | Type | +---------------+---------+ | order_id | int | | order_date | date | | item_id | int | | buyer_id | int | | seller_id | int | +---------------+---------+ order_id 是此表主键(具有唯一值的列)。 item_id 是 Items 表的外键(reference 列)。 (buyer_id,seller_id)是 User 表的外键。表:
Items
+---------------+---------+ | Column Name | Type | +---------------+---------+ | item_id | int | | item_brand | varchar | +---------------+---------+ item_id 是此表的主键(具有唯一值的列)。编写解决方案找出每个用户的注册日期和在
2019
年作为买家的订单总数。以 任意顺序 返回结果表。
查询结果格式如下。
示例 1:
输入: Users 表: +---------+------------+----------------+ | user_id | join_date | favorite_brand | +---------+------------+----------------+ | 1 | 2018-01-01 | Lenovo | | 2 | 2018-02-09 | Samsung | | 3 | 2018-01-19 | LG | | 4 | 2018-05-21 | HP | +---------+------------+----------------+ Orders 表: +----------+------------+---------+----------+-----------+ | order_id | order_date | item_id | buyer_id | seller_id | +----------+------------+---------+----------+-----------+ | 1 | 2019-08-01 | 4 | 1 | 2 | | 2 | 2018-08-02 | 2 | 1 | 3 | | 3 | 2019-08-03 | 3 | 2 | 3 | | 4 | 2018-08-04 | 1 | 4 | 2 | | 5 | 2018-08-04 | 1 | 3 | 4 | | 6 | 2019-08-05 | 2 | 2 | 4 | +----------+------------+---------+----------+-----------+ Items 表: +---------+------------+ | item_id | item_brand | +---------+------------+ | 1 | Samsung | | 2 | Lenovo | | 3 | LG | | 4 | HP | +---------+------------+ 输出: +-----------+------------+----------------+ | buyer_id | join_date | orders_in_2019 | +-----------+------------+----------------+ | 1 | 2018-01-01 | 1 | | 2 | 2018-02-09 | 2 | | 3 | 2018-01-19 | 0 | | 4 | 2018-05-21 | 0 | +-----------+------------+----------------+
三,建表语句
Create table If Not Exists Users (user_id int, join_date date, favorite_brand varchar(10));
Create table If Not Exists Orders (order_id int, order_date date, item_id int, buyer_id int, seller_id int);
Create table If Not Exists Items (item_id int, item_brand varchar(10));
Truncate table Users;
insert into Users (user_id, join_date, favorite_brand) values ('1', '2018-01-01', 'Lenovo');
insert into Users (user_id, join_date, favorite_brand) values ('2', '2018-02-09', 'Samsung');
insert into Users (user_id, join_date, favorite_brand) values ('3', '2018-01-19', 'LG');
insert into Users (user_id, join_date, favorite_brand) values ('4', '2018-05-21', 'HP');
Truncate table Orders;
insert into Orders (order_id, order_date, item_id, buyer_id, seller_id) values ('1', '2019-08-01', '4', '1', '2');
insert into Orders (order_id, order_date, item_id, buyer_id, seller_id) values ('2', '2018-08-02', '2', '1', '3');
insert into Orders (order_id, order_date, item_id, buyer_id, seller_id) values ('3', '2019-08-03', '3', '2', '3');
insert into Orders (order_id, order_date, item_id, buyer_id, seller_id) values ('4', '2018-08-04', '1', '4', '2');
insert into Orders (order_id, order_date, item_id, buyer_id, seller_id) values ('5', '2018-08-04', '1', '3', '4');
insert into Orders (order_id, order_date, item_id, buyer_id, seller_id) values ('6', '2019-08-05', '2', '2', '4');
Truncate table Items;
insert into Items (item_id, item_brand) values ('1', 'Samsung');
insert into Items (item_id, item_brand) values ('2', 'Lenovo');
insert into Items (item_id, item_brand) values ('3', 'LG');
insert into Items (item_id, item_brand) values ('4', 'HP');
select * from orders;
select * from users;
select * from items;
四,分析
思路
表格大法: 过滤2019年的订单,左连接2个表,以用户id分组 聚合订单数量,去重,改名,输出
第一步:过滤订单表(orders)中非2019年的订单行数;
第二步:以用户表 左连接订单表 连接条件 用户的id和订单表中的buyerid,左连接的原因,加入有的用户没有下单的呢?
第三步:开窗count 扩充一列 统计以每个用户的下单数量;
第四步:映射指定的列,去重(开窗之后必然有重复的列),改名,输出
解题过程
mysql+pandas代码分别实现上述表格的逻辑
第一步:过滤订单表(orders)中非2019年的订单行数;
在mysql
第二步:以用户表 左连接订单表 连接条件 用户的id和订单表中的buyerid,左连接的原因,加入有的用户没有下单的呢?
在mysql
第三步:开窗count 扩充一列 统计以每个用户的下单数量;
在mysql
第四步:映射指定的列,去重(开窗之后必然有重复的列),改名,输出
在mysql
五,SQL解答
with t1 as (
select
order_id,order_date,buyer_id
from orders where year(order_date) ='2019'
)
# select * from t1;
,t2 as (
select
user_id, join_date,order_id,
count(order_id)over(partition by user_id) cnt
from users u left join t1 on u.user_id =t1.buyer_id
)
# select * from t2;
select
distinct user_id as buyer_id,
join_date,
cnt as orders_in_2019
from t2;
六,验证
七,知识点总结
- 时间行数的运用
- count开窗的运用
- 左连接的运用
- 去重的运用
- 学习:知识的初次邂逅
- 复习:知识的温故知新
- 练习:知识的实践应用