分享SQL,查詢用戶最近一次購買時間間隔


(1)先創建一張測試表:

1   CREATE TABLE `用戶購買訂單` (
2 
3   `購買時間` datetime(6) NULL DEFAULT NULL,
4 
5   `用戶` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
6 
7   `費用` decimal(20, 2) NULL DEFAULT NULL
8 
9   ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

(2)往數據表填充數據:

 1   INSERT INTO `用戶購買訂單` VALUES ('2019-04-16 00:00:00.000000', '張三', 100.00);
 2 
 3   INSERT INTO `用戶購買訂單` VALUES ('2019-04-15 00:00:00.000000', '李四', 95.00);
 4 
 5   INSERT INTO `用戶購買訂單` VALUES ('2019-04-14 00:00:00.000000', '張A', 85.00);
 6 
 7   INSERT INTO `用戶購買訂單` VALUES ('2019-04-13 00:00:00.000000', '張B', 70.00);
 8 
 9   INSERT INTO `用戶購買訂單` VALUES ('2019-04-12 00:00:00.000000', '張C', 77.00);
10 
11   INSERT INTO `用戶購買訂單` VALUES ('2019-04-11 00:00:00.000000', '張D', 68.00);
12 
13   INSERT INTO `用戶購買訂單` VALUES ('2019-04-10 00:00:00.000000', '張E', 53.00);
14 
15   INSERT INTO `用戶購買訂單` VALUES ('2019-05-16 00:00:00.000000', '張三', 100.00);
16 
17   INSERT INTO `用戶購買訂單` VALUES ('2019-06-15 00:00:00.000000', '李四', 95.00);
18 
19   INSERT INTO `用戶購買訂單` VALUES ('2019-03-14 00:00:00.000000', '張A', 85.00);
20 
21   INSERT INTO `用戶購買訂單` VALUES ('2019-09-13 00:00:00.000000', '張B', 70.00);
22 
23   INSERT INTO `用戶購買訂單` VALUES ('2019-10-12 00:00:00.000000', '張C', 77.00);
24 
25   INSERT INTO `用戶購買訂單` VALUES ('2019-08-11 00:00:00.000000', '張D', 68.00);
26 
27   INSERT INTO `用戶購買訂單` VALUES ('2019-09-10 00:00:00.000000', '張E', 53.00);
28 
29   INSERT INTO `用戶購買訂單` VALUES ('2018-02-05 00:00:00.000000', '張三', 100.00);

 

(3)實現思路:

  (3.1)首先做個合並表查詢:

 1       SELECT
 2 
 3         用戶購買訂單.購買時間,用戶購買訂單.用戶,a.購買時間 '購買時間1',a.用戶 '用戶1'
 4 
 5       FROM
 6 
 7         用戶購買訂單
 8 
 9       INNER JOIN
10 
11         (SELECT * from 用戶購買訂單)a
12 
13       ON
14 
15         用戶購買訂單.`用戶` = a.`用戶` AND 用戶購買訂單.購買時間 <> a.購買時間

 

查詢結果:

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

(3.2)基於3.1求時間差:

 1     SELECT
 2 
 3       購買時間,用戶,購買時間1,用戶1,DATEDIFF(購買時間,購買時間1) as '購買日期間隔'
 4 
 5     FROM
 6 
 7       (SELECT
 8 
 9         用戶購買訂單.購買時間,用戶購買訂單.用戶,a.購買時間 '購買時間1',a.用戶 '用戶1'
10 
11       FROM
12 
13         用戶購買訂單
14 
15       INNER JOIN
16 
17         (SELECT * from 用戶購買訂單)a
18 
19       ON
20 
21         用戶購買訂單.`用戶` = a.`用戶` AND 用戶購買訂單.購買時間 <> a.購買時間
22 
23       )b

 

查詢結果:

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

(3.3)過濾掉"購買日期間隔"為負數的行:

 1     SELECT
 2 
 3        購買時間,用戶,購買時間1,用戶1,DATEDIFF(購買時間,購買時間1) as '購買日期間隔'
 4 
 5     FROM
 6 
 7         (SELECT
 8 
 9           用戶購買訂單.購買時間,用戶購買訂單.用戶,a.購買時間 '購買時間1',a.用戶 '用戶1'
10 
11          FROM
12 
13           用戶購買訂單
14 
15         INNER JOIN
16 
17           (SELECT * from 用戶購買訂單)a
18 
19         ON
20 
21           用戶購買訂單.`用戶` = a.`用戶` AND 用戶購買訂單.購買時間 <> a.購買時間
22 
23         )b
24 
25     WHERE
26 
27         DATEDIFF(購買時間,購買時間1)>=0

 

查詢結果:

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

(3.4)因為我們要求每個用戶最近一次與上一次購買的時間間隔,所以,我們要基於上圖對用戶分組,去購買日期間隔最小值:

 1       SELECT
 2 
 3           用戶,MIN(購買日期間隔) '距離上一次購買天數'
 4 
 5       FROM
 6 
 7         (
 8 
 9         SELECT
10 
11             購買時間,用戶,購買時間1,用戶1,DATEDIFF(購買時間,購買時間1) as '購買日期間隔'
12 
13         FROM
14 
15           (SELECT
16 
17             用戶購買訂單.購買時間,用戶購買訂單.用戶,a.購買時間 '購買時間1',a.用戶 '用戶1'
18 
19           FROM
20 
21             用戶購買訂單
22 
23           INNER JOIN
24 
25             (SELECT * from 用戶購買訂單)a
26 
27           ON
28 
29             用戶購買訂單.`用戶` = a.`用戶` AND 用戶購買訂單.購買時間 <> a.購買時間
30 
31             )b
32 
33         WHERE
34 
35           DATEDIFF(購買時間,購買時間1)>=0
36 
37       )c
38 
39       GROUP BY
40 
41            用戶

 

查詢結果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM