SQL:結構化查詢語言(Structured Query Language)
留存率
現有一表Retention如下
id |
name |
register_time |
logout_time |
101 |
Anna |
2018-01-01 00:00:01.000 |
2018-01-02 00:00:01.003 |
… |
… |
… |
… |
register_time表示用戶註冊時間,logout_time表示用戶註銷時間。現要計算每一日的用戶次日留存率(假如1號有5人註冊,這5人有2人在2號註銷,則1號當天的次日留存率爲3/5=60%)
1、建表
- CREATE TABLE Retention
- (
- id int NOT NULL PRIMARY KEY,
- name nvarchar(50) NOT NULL,
- register_timedatetime NOT NULL,
- logout_timedatetime NOT NULL,
- );
|
2、插入數據
- INSERT INTO Retention
- VALUES (101, 'Anna', CONVERT(datetime,2018-01-01 00:00:01', 20), CONVERT(datetime,2018-01-01 00:00:01', 20));
- …
|
3、更新數據
- UPDATE Retention
- SET logout_time = convert(datetime, 2018-01-02 00:00:02.003', 20)
- WHERE id=101;
|
4、計算留存率
當前表中數據如下:
SQL代碼如下:
- SELECT new.register_day AS '日期',
- new.cnt AS '當日註冊數',
- out.cnt AS '次日留存數',
- CAST(out.cnt*100.0/new.cnt AS varchar(20))+'%' AS '留存率'
- FROM (SELECT COUNT(1) as cnt, CONVERT(nvarchar(20),register_time,111) AS register_day
- FROM Retention
- GROUP BY CONVERT(nvarchar(20),register_time,111)
- ) AS new
- JOIN
- (SELECT COUNT(1) as cnt, CONVERT(nvarchar(20),register_time,111) AS register_day
- FROM Retention
- where CONVERT(nvarchar(20),logout_time,111) > CONVERT(nvarchar(20),DATEADD(DAY,1,register_time),111)
- GROUP BY CONVERT(nvarchar(20),register_time,111)
- ) AS out
- ON new.register_day=out.register_day
|
計算結果:
這個方法好麻煩,有沒有簡單一點的方法/(ㄒoㄒ)/~~
5、刪除表