我最近在测试工作时遇到了这个问题。我有下表。
TABLE sessions
id INTEGER primary key;
userId INTEGER NOT NULL;
duration INTEGER NOT NULL;
我需要编写一个选择userID的查询以及每个用户超过1个会话的平均持续时间。换句话说,我需要平均在表中出现多次的所有userId的持续时间。任何人都可以帮我这个吗?
答案 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)
。
但是,面试候选人会传递第一个查询。