sq面试题04

给出 2017 年每个月的订单数、用户数、总成交金额,给
2017 11 月的新客数 ( 指在 11 月才有第一笔订单 )
-- 已知一个表 STG.ORDER ,有如下字段 :Date Order_id User_id amount
-- 数据样例 :2017-01-01,10029028,1000003251,33.57
-- 请给出 sql 进行统计 :
--(1) 给出 2017 年每个月的订单数、用户数、总成交金额。
--(2) 给出 2017 11 月的新客数 ( 指在 11 月才有第一笔订单 )

数据准备:

 

CREATE TABLE shopping2 (
dt varchar(30),
order_id varchar(30),
user_id varchar(30),
amount int )
;

insert into shopping2 values
('2017-01-01','10029028','1000003251',33.57)
,('2017-01-01','10029029','1000003251',33.57)
,('2017-01-01','100290288','1000003252',33.57)
,('2017-02-02','10029088','1000003251',33.57)
,('2017-02-02','100290281','1000003251',33.57)
,('2017-02-02','100290282','1000003253',33.57)
,('2017-11-02','10290282','100003253',234)
,('2017-11-01','102902810','100003253',234)
,('2018-11-02','10290284','100003243',234)

这道题实际上是两个问题,第一个问题:

--(1)给出 2017年每个月的订单数、用户数、总成交金额。

分别站在订单数、用户数、金额三个维度对数据经行聚合(通过时间),但是要注意对用户进行聚合时要对重复的用户进行去重。

sql实现:

select substr(dt,1,7)
      ,count(order_id)
      ,count(distinct(user_id))
      ,sum(amount) 
from shopping2 where substr(dt,1,4)='2017' group by 1;

实现效果:

 02.第二个问题--给出2017年11月的新客数(指在11月才有第一笔订单)

两点需要注意的,一是2017年11月出现的新客,第二点是第一笔订单。

方法一通过子查询来实现。实现sql:

select * from shopping2 where substr(dt,1,7) = '2017-11' and user_id not in (
select user_id from shopping2 where substr(dt,1,7)<'2017-11'
) order by dt limit 1

实现效果:

方法二:通过开窗函数来实现

sql:

select t1.dt,t1.order_id,t1.user_id,t1.amount from (
select dt,order_id,user_id,amount,row_number() over(partition by user_id order by dt) rn from  shopping2  where substr(dt,1,7) = '2017-11'
) t1 where t1.rn = 1

 用开窗也要嵌套一层子查询,通过过滤子查询中的rn=1,来获取每个客户201711的第一个订单。实现效果和方法一。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宇智波天坪小梁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值