mysql下载后的初次使用⽤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如下:
由于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;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。