[英]SQL calculate upgrade rate of fraction
给定以下两个表
用户
user_id name join_date
1 Jon 2020-02-14
2 Jane 2020-02-14
3 Jill 2020-02-15
4 Josh 2020-02-15
5 Jean 2020-02-16
6 Justin 2020-02-17
7 Jeremy 2020-02-18
事件
user_id type access_date
1 F1 2020-03-01
2 F2 2020-03-02
2 P 2020-03-12
3 F2 2020-03-15
4 F2 2020-03-15
1 P 2020-03-16
3 P 2020-03-22
返回访问功能二(在事件表中键入:F2)并在注册后的前 30 天内升级到高级版的用户比例,四舍五入到小数点后两位。 它应该给 upgrade_rate 0.33。
这是我的尝试
;WITH users AS (
SELECT * FROM (
VALUES
(1, 'Jon', CAST('14-02-20' AS date)),
(2, 'Jane', CAST('14-02-20' AS date)),
(3, 'Jill', CAST('15-02-20' AS date)),
(4, 'Josh', CAST('15-02-20' AS date)),
(5, 'Jean', CAST('16-02-20' AS date)),
(6, 'Justin', CAST('17-02-20' AS date)),
(7, 'Jeremy', CAST('18-02-20' AS date))
) AS _ (user_id, name, join_date)
),
events AS (
SELECT * FROM (
VALUES
(1, 'F1', CAST('01-03-20' AS date)),
(2, 'F2', CAST('02-03-20' AS date)),
(2, 'P', CAST('12-03-20' AS date)),
(3, 'F2', CAST('15-03-20' AS date)),
(4, 'F2', CAST('15-03-20' AS date)),
(1, 'P', CAST('16-03-20' AS date)),
(3, 'P', CAST('22-03-20' AS date))
) AS _ (user_id, type, access_date)
),
feature_two_upg AS (
SELECT *
FROM events
WHERE type = 'F2'
),
premium_upg AS (
SELECT *
FROM events
WHERE type = 'P'
),
differ_date AS (
SELECT feature.user_id, premium.access_date
FROM feature_two_upg AS feature
INNER JOIN premium_upg AS premium
ON feature.user_id = premium.user_id
WHERE DATEDIFF(DAY, feature.access_date, premium.access_date) < 30
)
SELECT ROUND(AVG(CAST(CASE WHEN differ_date.user_id IS NOT NULL THEN 1.0 ELSE 0.0 END AS float)), 2) AS upgrade_rate
FROM users
LEFT JOIN differ_date
ON users.user_id = differ_date.user_id
现在它给了我 0.29 upgrade_rate 我想知道为什么
所以,我正在检查您的查询,让我们显示没有 function 的表的结果
SELECT users.user_id, differ_date.user_id
FROM users
LEFT JOIN differ_date
ON users.user_id = differ_date.user_id
结果是这样的
users.user_id differ_date.user_id
1 NULL
2 2
3 3
4 NULL
5 NULL
6 NULL
7 NULL
现在检查你的公式,每次 differ_date.user_id 不是 null 你求和 1,然后 function 平均计数 7 寄存器,是 2 / 7 = 0.28571428,四舍五入 2 = 0.29
最好的祝福
当我运行它时,我得到 0.00,除非我在 differ_date 中注释掉 WHERE DATEDIFF(DAY, feature.access_date, premium.access_date) < 30,然后我得到 29。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.