用SQL提取用户首次下单的信息(金额、时间)

被打倒一次,你站起来了;两次,你又站起来了。我相信你能做到!可百次呢?千次呢?

最近一直在刷一些数据分析的笔试题,在网易2020的校招题目中看到这样一道SQL题:

用户第一单购买的行为往往反映了用户对平台的信任度和消费能力。现在数据库中有一张用户交易表order,其中有userid(用户ID)、amount(消费金额)、paytime(支付时间),请写出对应的SQL语句,查出每个用户第一单的消费金额。

笔者在网上看到了一些解答,但是总觉的有瑕疵,于是就自己建了表,用My SQL测试了一下,发现了一些容易被忽略的地方,分享给大家。
知道order表有3个字段:userid、amount、paytime,求出每个用户第一单的消费金额。笔者稍微研究了一下就得出了一个答案。逻辑:先找出每个用户第一单的消费时间,然后对应userid和paytime匹配相应的amount即可。

示例1:(有瑕疵版)
select o.userid,o.amount,ump.mp
from (select userid,min(paytime) as mp from use_order group by userid) as ump
join user_order as o on ump.mp=o.paytime order by userid;

这是我创建的表user_order如下:
user_order
由于order与SQL的排序语句重叠,所以我新建的表名字其实是user_order。
这是查询结果:
输出结果
瑕疵就是,如果不同用户的paytime有相同的,那么就会出现这种问题。userid = 2的用户出现了两个记录,是不对的。(在实际业务中,订单的paytime按照时间戳自动生成,肯定是不会出现这种有重复时间的问题。而且实际使用中,表肯定是有主键的,主键是不会重复的。)

示例2:使用两个连接条件

所以在连接两个表的时候就不能仅仅看paytime这一个字段,还要结合userid字段,略微调整一下SQL语句:

select uo.userid,uo.amount,ump.mp
from (select userid,min(paytime) as mp from user_order group by userid) as ump
join user_order as uo on ump.mp=uo.paytime and ump.userid=uo.userid order by userid;

输出结果如下:
输出结果

示例3:使用where条件

同样的效果也可以使用where条件语句达到:

select uo.userid,uo.amount,ump.mp
from (select userid,min(paytime) as mp from user_order group by userid) as ump, user_order as uo
where ump.userid=uo.userid and ump.mp=uo.paytime order by userid;

输出结果

  • 9
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值