使用SQL获得平均值

时间:2018-02-17 17:33:00

标签: sql

我最近在测试工作时遇到了这个问题。我有下表。

TABLE sessions
   id INTEGER primary key;
   userId INTEGER NOT NULL;
   duration INTEGER NOT NULL;

我需要编写一个选择userID的查询以及每个用户超过1个会话的平均持续时间。换句话说,我需要平均在表中出现多次的所有userId的持续时间。任何人都可以帮我这个吗?

1 个答案:

答案 0 :(得分:10)

您可以简单地使用having子句:

select userid, avg(duration)
from sessions
group by userid
having count(*) > 1;

这将是“接受”的答案。通常最快的方法是:

select userid, avg(duration)
from sessions s
where exists (select 1 from sessions s2 where s2.userid = s.userid and s2.id <> s.id)
group by userid;

如果许多用户完成并且您在(userid, id)上有索引,则会更快。为什么?因为查询在聚合之前快速过滤并且显着减少行数会加快聚合速度,而不是检查成本(在给定情况下)。

并且,在进行整数运算的数据库中,您可能需要avg(duration * 1.0)

但是,面试候选人会传递第一个查询。