SQL 查询最新套餐用户

问题需求:

在数据库中,以时间为维度查询出移动客户最新开通的套餐。

 

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

思路:

查询出号码对应最新的更改套餐的时间,然后在通过条件匹配查询出该用户最新的套餐。

 

 

第一步:

查询出用户最新一次更改套餐的时间,查询以用户作为分组,选出时间最新的(最大)的时间。

select msisdn , MAX(time) from b GROUP BY msisdn

 

第二步:

以此作为条件来匹配原始表B中的数据,通过左连接或者右连接来匹配查询。

select a.msisdn ,  a.time , b.tariff_packages from B                                --查询a.表中的用户,a.表中的时间,b表中的套餐
RIGHT JOIN                                                                                            --右连接查询
(select msisdn , MAX(time) as time from b GROUP BY msisdn) a         --将刚刚查询到的结果命名为表a
on (B.msisdn = a.msisdn and B.time = a.time)                                        --匹配条件是两个表的用户和时间都能匹配上的结果才输出

注意:在连接查询中需要注明被查询的字段是来自哪一张表的,不然会出现查询时候的报错,报错内容是XXX字段不知来源那张表 ,只需要标明清楚即可解决。

输出的结果:

 

 

用户135002当前最新在使用的套餐是B

用户135001当前最新在使用的套餐是A

用户135003当前最新在使用的套餐是C

 

备注:原表中的部分数据并不是按照时间顺序进行插入的,在实际应用中,可能存在某一天的数据丢失过几天才补上的情况,

所以会出现部分数据的时间插入的先后顺序不一致的情况,但是并不会查询的效果。

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

附1:表结构以及注释

表B

字段                           类型           注释

msisdn                       int              用户号码

time                           int              时间(方便计算 用int类型作为比较)

tariff_packages         varchar      修改后的套餐类型

 

附2:插入语句代码

insert into b (msisdn , time , tariff_packages) VALUES (135001,20180101,'A');
insert into b (msisdn , time , tariff_packages) VALUES (135002,20180123,'C');
insert into b (msisdn , time , tariff_packages) VALUES (135003,20180123,'A');
insert into b (msisdn , time , tariff_packages) VALUES (135001,20180317,'C');
insert into b (msisdn , time , tariff_packages) VALUES (135002,20180415,'B');
insert into b (msisdn , time , tariff_packages) VALUES (135003,20180418,'B');
insert into b (msisdn , time , tariff_packages) VALUES (135002,20180419,'B');
insert into b (msisdn , time , tariff_packages) VALUES (135001,20180518,'B');
insert into b (msisdn , time , tariff_packages) VALUES (135003,20180619,'C');
insert into b (msisdn , time , tariff_packages) VALUES (135003,20180711,'C');
insert into b (msisdn , time , tariff_packages) VALUES (135001,20180712,'A');
insert into b (msisdn , time , tariff_packages) VALUES (135003,20180718,'B');
insert into b (msisdn , time , tariff_packages) VALUES (135002,20180102,'C');
insert into b (msisdn , time , tariff_packages) VALUES (135003,20180801,'C');
insert into b (msisdn , time , tariff_packages) VALUES (135003,20180730,'A');

posted @ 2018-07-22 11:45  包子铺1234  阅读(361)  评论(0编辑  收藏  举报