0

假设我有一张统计表:

Page | Action | Time
--------------------
Home | Logon  |  12
Home | Logon  |  11
Home | Search |  20
About| Comment|  10

我可以编写一个查询来获取每个页面的平均操作时间:

select Page, avg(Time) from statistics group by Page

但我想更聪明一点。为了突出显示哪些页面的操作最,我想获得(时间 - 所有页面上所有操作的平均时间)的总和。我可以在单独的查询中做到这一点:

select avg(Time) from statistics
-> 15
select Page, sum(Time - 15) from statistics group by Page

问题是,有没有办法在一个查询中做到这一点?

显然select Page, sum(Time - avg(Time)) from statistics group by Page行不通。Oracle 抛出“ORA-00937: not a single-group group function”。

4

2 回答 2

6

您可以使用窗口功能:

SELECT  DISTINCT 
        Page, 
        AVG(Time) OVER(PARTITION BY Page) - AVG(Time) OVER() AS Variance
FROM    Statistics

为了稍微扩展,您可以在一个查询中获得许多不同的平均值:

SELECT  Page, 
        Action,
        Time,
        AVG(Time) OVER(PARTITION BY Page, Action) AS AverageActionTime,
        AVG(Time) OVER(PARTITION BY Page) AS AveragePageTime,
        AVG(Time) OVER() AS AverageTime
FROM    Statistics

http://sqlfiddle.com/#!4/42a5f/8

于 2012-06-14T09:31:14.013 回答
2

您可以使用子查询来计算平均时间:

select  stat.Page
,       sum(stat.Time - avg_stat.time) 
from    statistics stat
cross join    
        (
        select  avg(Time) as time
        from    statistics
        ) avg_stat
group by 
        stat.Page
于 2012-06-14T09:23:14.283 回答