如何在 SQL 中计算每个用户的唯一日期的平均收入
Posted
技术标签:
【中文标题】如何在 SQL 中计算每个用户的唯一日期的平均收入【英文标题】:How to calculate in SQL average revenue from unique dates per user 【发布时间】:2021-09-13 14:09:30 【问题描述】:当涉及到“注册日期后 1 和 2 个月内”时,我无法找到总数。我希望对我当前的代码提供一些帮助和一些反馈。没有错误,只是不知道如何解决这个问题
问题是:求在注册日期后 1 个月和 2 个月内 1 月注册的每位会员的平均收入
数据表为:
表 1:成员资格
member_id (PK) 整数 注册日期日期时间 join_country varchar(2) 电子邮件 varchar 取消日期日期 expiry_date 日期
表 2:交易
transaction_id (PK) 整数 member_id 整数 交易日期日期时间 transaction_type_ID 整数 product_id 整数 交易金额浮动
当前代码:
SELECT AVG (t.transaction_amount) AS AVG_REV,
COUNT(m.member_id) AS Member_ID
FROM transactions AS t
INNER JOIN memberships AS m
ON m.member_id = t.member_id
WHERE m.signup_date BETWEEN '2018-01-01' AND '2018-01-31'
GROUP BY m.member_id
;
【问题讨论】:
样本数据和期望的结果真的很有帮助。 【参考方案1】:SELECT
m.member_id,
AVG(CASE WHEN t.transaction_date <= m.signup_date + '1 month'::interval THEN t.transaction_amount END) AS AVG_1ST_MONTH,
AVG(CASE WHEN t.transaction_date > m.signup_date + '1 month'::interval AND t.transaction_date <= m.signup_date + '2 month'::interval THEN t.transaction_amount END) AS AVG_2ND_MONTH
FROM transactions AS t
INNER JOIN memberships AS m
ON m.member_id = t.member_id
WHERE m.signup_date BETWEEN '2018-01-01' AND '2018-01-31'
GROUP BY m.member_id
此外,您原始查询中这部分的别名没有意义:COUNT(m.member_id) AS Member_ID
- 这实际上会计算每个成员的记录数(您可以说交易数),所以我不是确定你为什么将它命名为Member_ID
【讨论】:
【参考方案2】:查找 1 月份注册的每位会员在其注册日期后的 1 个月和 2 个月内的平均收入
听起来您需要两个数字:注册后 1 个月的平均收入和注册后 2 个月的平均收入。每个member_id
确实没有“平均收入”。每个成员都有总收入,然后是所有成员的平均收入。
我认为最好的方法是按会员汇总收入,然后取平均值。按成员划分,这些时期的总收入为:
SELECT m.member_id,
SUM(t.transaction_amount) AS member_revenue,
SUM(t.transaction_amount) FILTER (WHERE t.transaction_date < m.signup_date + interval '1 month') AS member_revenue_month_1,
SUM(t.transaction_amount) FILTER (WHERE t.transaction_date < m.signup_date + interval '2 month') AS member_revenue_month_2
FROM transactions t JOIN
memberships m
ON m.member_id = t.member_id
WHERE m.signup_date >= '2018-01-01' AND
m.signup_date < '2018-02-01'
GROUP BY m.member_id;
然后,再次汇总总体平均值:
SELECT AVG(member_revenue_month_1),
AVG(member_revenue_month_2)
FROM (SELECT m.member_id,
SUM(t.transaction_amount) AS member_revenue,
SUM(t.transaction_amount) FILTER (WHERE t.transaction_date < m.signup_date + interval '1 month') AS member_revenue_month_1,
SUM(t.transaction_amount) FILTER (WHERE t.transaction_date < m.signup_date + interval '2 month') AS member_revenue_month_2
FROM transactions t JOIN
memberships m
ON m.member_id = t.member_id
WHERE m.signup_date >= '2018-01-01' AND
m.signup_date < '2018-02-01'
GROUP BY m.member_id;
) m
【讨论】:
以上是关于如何在 SQL 中计算每个用户的唯一日期的平均收入的主要内容,如果未能解决你的问题,请参考以下文章