繁体   English   中英

SQL 计算分数升级率

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM