如何在mySQL中对相同的行进行求和并找到那些高于平均值的行?

时间:2017-11-18 21:02:41

标签: php mysql sql

这是我的数据库表的示例:

visitor_id ---- url ---- duration
1 ------------ home ------- 5
1 ------------ about ------ 8
1 ------------ about ------ 3
1 ------------ contact ---- 2
1 ------------ home ------- 3
1 ------------ services --- 2

我想要实现的是显示超过所有网址平均值的网址。但首先我需要通过网址对持续时间组进行求和。

例如,所有页面的平均值= 5 + 8 + 3 + 2 + 3 + 2 = 23/6 = 3.8

因此,将显示的页面是家庭(8秒)和大约(11)。

我怎样才能做到这一点?

这是我到目前为止所拥有的

select sum(duration), url from pages where visitor_id='1' group by url

3 个答案:

答案 0 :(得分:0)

您可以join平均值或使用having子句。我会把它写成:

select p.visitor_id, p.url, avg(p.duration)
from pages p
where visitor_id = 1 
group by p.visitor_id, p.url
having avg(p.duration) > (select avg(p2.duration)
                          from pages p2
                          where p2.visitor_id = p.visitor_id
                         );

注意:

  • 我猜测visitor_id是数字,所以常数是数字而不是字符串。
  • having子句中的子查询与外部查询相关,因此访问者ID只输入一次。
  • 查询按访问者ID和网址聚合,因此适用于任何数量(或所有)访问者。

答案 1 :(得分:0)

您可以在子查询上使用for avg

  select sum(duration) sum_dur, url 
  from pages 
  where visitor_id='1' 
  group by url 
  having sum_dur > (
  select avg(duration)  
  from  pages 
  where visitor_id='1' 
  )

答案 2 :(得分:-1)

试试这个:

Select url
,visitor_id
,duration
From (
select url
,visitor_id
,sum(duration) as duration
,avg(duration) over (partition by visitor_id) as avg_by_visitor_id
from pages
group by url
,visitor_id
,duration) as data
where data.avg_by_visitor_id<=data.duration