【问题标题】:How to calculate average value?如何计算平均值?
【发布时间】:2019-02-07 18:10:26
【问题描述】:

我有两张桌子。进入第一个表(活动)有:user_id、sessions和login_time。在第二个(付款)中只有一列 - user_id。

我需要计算“付款”用户在 01/01/2018-01/05/2018 期间进行了多少次会话。

activity

user_id   sessions   login_time
1           6         01.01.2018
2           2         01.01.2018
1           1         02.01.2018
4           3         02.01.2018
1           2         03.05.2018
3                     04.02.2018

表格

payments
user_id
1
3
4

我的代码(计算错误):

select login_time, avg(activity.sessions) AS
average_sessions
from activity inner join
payments
on payments.user_id = activity.user_id
where activity.login_time between '2018-01-01' and '2018-05-01' 
group by activity.login_time;

感谢您的帮助!

输出:

output
login_time    average_sessions
01.01.2018     6
02.01.2018     2
03.01.2018     0
04.01.2018     0
...

【问题讨论】:

  • 也给出你预期的输出!没有预期的输出,问题有点不清楚
  • @Madhur Bhaiya,我更新了
  • 您是否要计算每个用户的平均会话数?
  • @Madhur Bhaiya,是的。第二个表中的每个用户
  • avg(activity.sessions) 替换为SUM(activity.sessions)/COUNT(DISTINCT activity.user_id)

标签: mysql sql database join select


【解决方案1】:

寻找您的样品
似乎你需要会话总和除以总天数

  select  user_id, sum(sessions)/t.num_days
  from activity 
  cross join  (
  select count(distinct login_time) num_days
  from activity
  ) t 
  group by user_id  

如果您在付款中只需要 user_id

  select  user_id, sum(sessions)/t.num_days
  from activity 
  cross join  (
  select count(distinct login_time) num_days
  from activity
  ) t 
  inner join  payments p on p.user_id = activity.user_id
  group by user_id  

并查看您的形成结果似乎您需要

  select t1. login_time, ifnull(t2.avg_sess) average_sessions
  from (
  select distinct login_time 
  from activity 
  ) t1  
  left join (
  select a.login_time, avg(a.session) avg_sess
  from activity a
  inner join payments p on a.user_id  = p.user_id
  group by a.login_time
  ) t2 on t1.login_time = t2.login_time

【讨论】:

  • 谢谢,但我只需要按日期从第二个表计算每个用户的平均会话。我该怎么做?
  • 好的,但我需要一个两列的表。一列是日期(2018 年 1 月 4 日、2018 年 2 月 4 日...),另一列是付款用户的会话数量。请回答
  • @ЕлисейГорьков asnwer 已更新 .. 根据您的结果 .. 希望是您正在寻找的
【解决方案2】:

根据您的预期输出,使用以下内容:

SELECT login_time, 
       SUM(activity.sessions)/COUNT(DISTINCT activity.user_id) AS average_sessions
FROM activity 
INNER JOIN payments ON payments.user_id = activity.user_id
WHERE activity.login_time BETWEEN '2018-01-01' and '2018-05-01' 
GROUP BY activity.login_time;

【讨论】:

  • 谢谢。但我认为它从所有用户会话中搜索平均值,但我只需要从第二个表中搜索会话。
  • @ЕлисейГорьков 由于INNER JOIN,它仅适用于来自第二个表用户的会话。它将会话限制为仅考虑来自payments 表用户。
  • 你能解释一下为什么在这种情况下 avg() 和 "SUM(activity.sessions)/COUNT(DISTINCT activity.user_id)" 会给出不同的结果吗?
  • DISTINCT 确保 user_id 不会被多次计算,以防活动表中的 user_id 有多行。
  • @ЕлисейГорьков 我刚刚检查了您的原始查询是否也根据您的预期输出给出了结果。那么到底是什么问题呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-14
  • 2022-11-29
  • 2012-06-19
相关资源
最近更新 更多