问题需求:
在数据库中,以时间为维度查询出移动客户最新开通的套餐。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
思路:
查询出号码对应最新的更改套餐的时间,然后在通过条件匹配查询出该用户最新的套餐。
第一步:
查询出用户最新一次更改套餐的时间,查询以用户作为分组,选出时间最新的(最大)的时间。
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‘);
原文地址:https://www.cnblogs.com/qinfangzhe/p/9349567.html