1. 程式人生 > >SQL 查詢最新套餐用戶

SQL 查詢最新套餐用戶

問題 命名 color varchar value 數據庫 一次 實際應用 順序

問題需求:

在數據庫中,以時間為維度查詢出移動客戶最新開通的套餐。

技術分享圖片

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

思路:

查詢出號碼對應最新的更改套餐的時間,然後在通過條件匹配查詢出該用戶最新的套餐。

第一步:

查詢出用戶最新一次更改套餐的時間,查詢以用戶作為分組,選出時間最新的(最大)的時間。

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