日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQL计算复购率

發布時間:2024/1/8 数据库 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL计算复购率 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

需求背景:
訂單表中有每筆訂單的下單時間、用戶ID、訂單金額等信息,需要統計每個月在接下來幾個月用戶復購情況。

create table order_info( order_id int primary key, user_id int, amount decimal(10,2), create_time datetime );insert into order_info values (101,11211,749.00,'2020-01-01 00:04:00'), (102,75205,939.00,'2020-01-05 09:15:00'), (103,81384,349.00,'2020-01-08 22:19:00'), (104,50437,687.00,'2020-01-11 22:17:00'), (105,30321,658.00,'2020-01-12 22:18:00'), (106,49811,355.00,'2020-01-16 22:18:00'), (107,30352,363.00,'2020-01-19 22:24:00'), (108,30362,435.00,'2020-01-22 22:18:00'), (109,30363,270.00,'2020-01-27 22:19:00'), (110,30324,552.00,'2020-01-30 22:22:00'), (111,11211,692.00,'2020-02-04 08:35:00'), (112,75205,536.00,'2020-02-09 11:03:00'), (113,81384,478.00,'2020-02-13 09:32:00'), (114,30362,675.00,'2020-02-17 11:18:00'), (115,30363,723.00,'2020-02-20 08:47:00'), (116,30324,914.00,'2020-02-21 10:48:00'), (117,49262,444.00,'2020-02-24 18:35:00'), (118,12074,617.00,'2020-02-29 20:16:00'), (119,50437,911.00,'2020-03-02 12:35:00'), (120,30321,695.00,'2020-03-14 23:53:00'), (121,12074,275.00,'2020-03-15 15:38:00'), (122,81384,1066.00,'2020-03-18 16:49:00'), (123,30362,431.00,'2020-03-23 09:01:00'), (124,27727,687.00,'2020-03-25 15:38:00'), (125,27727,858.00,'2020-03-28 17:44:00');select * from order_info; +----------+---------+---------+---------------------+ | order_id | user_id | amount | create_time | +----------+---------+---------+---------------------+ | 101 | 11211 | 749.00 | 2020-01-01 00:04:00 | | 102 | 75205 | 939.00 | 2020-01-05 09:15:00 | | 103 | 81384 | 349.00 | 2020-01-08 22:19:00 | | 104 | 50437 | 687.00 | 2020-01-11 22:17:00 | | 105 | 30321 | 658.00 | 2020-01-12 22:18:00 | | 106 | 49811 | 355.00 | 2020-01-16 22:18:00 | | 107 | 30352 | 363.00 | 2020-01-19 22:24:00 | | 108 | 30362 | 435.00 | 2020-01-22 22:18:00 | | 109 | 30363 | 270.00 | 2020-01-27 22:19:00 | | 110 | 30324 | 552.00 | 2020-01-30 22:22:00 | | 111 | 11211 | 692.00 | 2020-02-04 08:35:00 | | 112 | 75205 | 536.00 | 2020-02-09 11:03:00 | | 113 | 81384 | 478.00 | 2020-02-13 09:32:00 | | 114 | 30362 | 675.00 | 2020-02-17 11:18:00 | | 115 | 30363 | 723.00 | 2020-02-20 08:47:00 | | 116 | 30324 | 914.00 | 2020-02-21 10:48:00 | | 117 | 49262 | 444.00 | 2020-02-24 18:35:00 | | 118 | 12074 | 617.00 | 2020-02-29 20:16:00 | | 119 | 50437 | 911.00 | 2020-03-02 12:35:00 | | 120 | 30321 | 695.00 | 2020-03-14 23:53:00 | | 121 | 12074 | 275.00 | 2020-03-15 15:38:00 | | 122 | 81384 | 1066.00 | 2020-03-18 16:49:00 | | 123 | 30362 | 431.00 | 2020-03-23 09:01:00 | | 124 | 27727 | 687.00 | 2020-03-25 15:38:00 | | 125 | 27727 | 858.00 | 2020-03-28 17:44:00 | +----------+---------+---------+---------------------+

解析思路:
第一步:查詢每個月下過單的用戶

select month(create_time) as dt,user_id from order_info group by month(create_time),user_id; +------+---------+ | dt | user_id | +------+---------+ | 1 | 11211 | | 1 | 75205 | | 1 | 81384 | | 1 | 50437 | | 1 | 30321 | | 1 | 49811 | | 1 | 30352 | | 1 | 30362 | | 1 | 30363 | | 1 | 30324 | | 2 | 11211 | | 2 | 75205 | | 2 | 81384 | | 2 | 30362 | | 2 | 30363 | | 2 | 30324 | | 2 | 49262 | | 2 | 12074 | | 3 | 50437 | | 3 | 30321 | | 3 | 12074 | | 3 | 81384 | | 3 | 30362 | | 3 | 27727 | +------+---------+

第二步:查詢每個月下過單的總用戶數

select month(create_time) 月份,count(distinct user_id) 總用戶數 from order_info group by month(create_time); +------+----------+ | 月份 | 總用戶數 | +------+----------+ | 1 | 10 | | 2 | 8 | | 3 | 6 | +------+----------+

第三步:將每個月下過單的用戶的查詢結果作為臨時表進行自連接,用月份和用戶ID判斷是否復購,計算次月的復購用戶數

select t1.dt 自然月份,t2.dt 復購月份,count(distinct t2.user_id) 復購用戶數 from (select month(create_time) dt,user_id from order_info group by month(create_time),user_id) t1 join (select month(create_time) dt,user_id from order_info group by month(create_time),user_id) t2 on t1.user_id=t2.user_id and t1.dt < t2.dt group by t1.dt,t2.dt; +----------+----------+------------+ | 自然月份 | 復購月份 | 復購用戶數 | +----------+----------+------------+ | 1 | 2 | 6 | | 1 | 3 | 4 | | 2 | 3 | 3 | +----------+----------+------------+

第四步:復購率=復購用戶數/總用戶數

select 自然月份,復購月份,復購用戶數,總用戶數,round(復購用戶數/總用戶數,2) 復購率 from (select t1.dt 自然月份,t2.dt 復購月份,count(distinct t2.user_id) 復購用戶數 from (select month(create_time) dt,user_id from order_info group by month(create_time),user_id) t1 join (select month(create_time) dt,user_id from order_info group by month(create_time),user_id) t2 on t1.user_id=t2.user_id and t1.dt < t2.dt group by t1.dt,t2.dt) a join (select month(create_time) 月份,count(distinct user_id) 總用戶數 from order_info group by month(create_time)) b on a.自然月份=b.月份; +----------+----------+------------+----------+--------+ | 自然月份 | 復購月份 | 復購用戶數 | 總用戶數 | 復購率 | +----------+----------+------------+----------+--------+ | 1 | 2 | 6 | 10 | 0.60 | | 1 | 3 | 4 | 10 | 0.40 | | 2 | 3 | 3 | 8 | 0.38 | +----------+----------+------------+----------+--------+

總結

以上是生活随笔為你收集整理的SQL计算复购率的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。