繁体   English   中英

注册日期后 1 个月和 2 个月内每个成员从 1 月份开始的平均收入

[英]Average revenue per member from January within 1 month and 2 months of the signup date

我需要计算在注册日期的 1 个月和 2 个月内在 1 月份注册的每个成员的平均收入。

仅使用 SELECT 语句提供输出(无临时表或函数)。 也在寻找 MYSQL 语法

我有2张桌子。

Table: memberships, Columns:

member_id int PK
signup_date datetime
join_country varchar(2)
email varchar(45)
cancellation_date date
expiry_date date

Table: transactions, Columns:

transaction_id int PK
member_id int
transaction_date datetime
transaction_type_ID int
product_id int
transaction_amount float

SELECT m.member_id, m.signup_date, AVG(t.transaction_amount)
FROM memberships m
INNER JOIN transactions t
ON m.member_id = t.member_id
WHERE m.signup_date = '2018-01-01'
AND t.transaction_date >= '2018-01-01' AND t.transaction_date < '2018-03-01';

你只做在 1 月 1 日注册的会员,而不是在整个 1 月。 同样,您计算的是从 1 月 1 日算起的 2 个月,而不是他们的实际注册日期。

您不是在计算每个成员的平均值,而是在计算每笔交易的平均值。 您需要一个子查询来获取每个成员的总收入,然后主查询可以获得这个的平均值。

您没有按月对收入进行分组,因此注册后 1 个月和 2 个月不会产生单独的结果。

SELECT month, AVG(total) AS avg_revenue
FROM (
    SELECT TIMESTAMPDIFF(month, m.signup_date, t.transaction_date)+1 AS month,
            SUM(t.transaction_amount) AS total
    FROM mindgeek.memberships m
    INNER JOIN mindgeek.transactions t
    ON m.member_id = t.member_id AND t.transaction_date < DATE_ADD(m.signup_date, INTERVAL 2 MONTH)
    WHERE m.signup_date BETWEEN '2018-01-01' AND '2018-01-31'
    GROUP BY m.member_id, month
) AS per_member
GROUP BY month

我将TIMESTAMPDIFF()的结果加1 ,因为它返回整月数,向下取整。 所以从注册到 1 个月后的时间段返回0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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