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‘);
SQL 查詢最新套餐用戶