2011-06-07 64 views
3

我有一个名为包含Vehicle_Location列(及以上)表的MIN():获取一个COUNT(*)列

ID    NUMBER(10) 
SEQUENCE_NUMBER NUMBER(10) 
TIME   DATE 

,我试图得到最大/最小/平均数量的记录每天每个ID。

到目前为止,我有

select id, to_char(time), count(*) as c 
    from vehicle_location 
group by id, to_char(time), min having id = 16 

这给了我:

ID      TO_CHAR(TIME) COUNT(*)    
---------------------- ------------- ---------------------- 
16      11-05-31  159      
16      11-05-23  127        
16      11-06-03  56     

所以我想获得的COUNT(*)列的最小/最大/平均值。我使用Oracle作为RDBMS。

+0

小点,但使用'TO_CHAR(TIME)'得到一天组件依赖于你有'NLS_DATE_FORMAT'设置的东西,不包括时间。更常见的做法是用'TRUNC(TIME)'。在这种情况下我会穿上'ID过滤器= 16'的'where'条款,而不是'having'子句中,因为它不需要分组后进行评估 - 无论是工作,但你可能会打使用'where'的索引。 – 2011-06-07 07:31:54

回答

8

我没有一个oracle站上测试,但你应该能够只是包装你的SELECT围绕聚合为一个子查询/派生表/内嵌视图

因此,这将是(未经测试!)

SELECT 
    AVG(s.c) 
    , MIN(s.c) 
    , MAX(s.c) 
    , s.ID 
FROM 
    --Note this is just your query 
    (select id, to_char(time), count(*) as c from vehicle_location group by id, to_char(time), min having id = 16) as s 
GROUP BY s.ID 

下面是一些关于它的阅读:
http://www.devshed.com/c/a/Oracle/Inserting-SubQueries-in-SELECT-Statements-in-Oracle/3/

编辑:虽然通常它是主意,在一个单一的查询选择MINMAX

EDIT2:最小/最大问题与某些RDBMS(包括oracle)如何处理索引列上的聚合有关。这可能不会影响这个特定的查询,但前提是,它很容易使用索引来查找无论是MINMAX但不能同时在同一时间,因为任何指标可能无法有效地使用。
下面是一些关于它的阅读:
http://momendba.blogspot.com/2008/07/min-and-max-functions-in-single-query.html

+2

为什么是一个坏主意,在一个单一的查询选择既MIN和MAX? – 2011-06-07 03:51:55

+0

我说* *平时因为如何某些RDBMS(包括Oracle)计划'MIN'和'MAX'查询。它可以很快得到任何一个,但是当你问两者时,它可能不知道使用哪个索引。我编辑了我的答案。 – Matthew 2011-06-07 14:39:10