获取count(*)列的min()

Mar*_*son 4 sql oracle

我有一个名为Vehicle_Location的表,其中包含列(以及更多):

ID               NUMBER(10)
SEQUENCE_NUMBER NUMBER(10) 
TIME            DATE 
Run Code Online (Sandbox Code Playgroud)

而我正在尝试获取每个ID每天的最小/最大/平均记录数.

到目前为止,我有

select id, to_char(time), count(*) as c
  from vehicle_location
 group by id, to_char(time), min having id = 16
Run Code Online (Sandbox Code Playgroud)

这给了我:

ID                     TO_CHAR(TIME) COUNT(*)               
---------------------- ------------- ---------------------- 
16                     11-05-31      159                    
16                     11-05-23      127                             
16                     11-06-03      56                  
Run Code Online (Sandbox Code Playgroud)

所以我想得到count(*)列的min/max/avg.我使用Oracle作为我的RDBMS.

Mat*_*hew 9

我没有要测试的oracle站,但你应该只能将聚合器包装在SELECT子查询/派生表/内联视图中

所以它会是(UNTESTED !!)

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
Run Code Online (Sandbox Code Playgroud)

以下是对它的一些解读:http:
//www.devshed.com/c/a/Oracle/Inserting-SubQueries-in-SELECT-Statements-in-Oracle/3/

编辑:尽管通常这是一个糟糕的主意,选择两者MIN,并MAX在一个单一的查询.

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

  • 为什么在单个查询中同时选择MIN和MAX是个坏主意? (2认同)