Oracle: how to “group by” over a range?

后端 未结 10 1535
隐瞒了意图╮
隐瞒了意图╮ 2020-12-07 22:26

If I have a table like this:

pkey   age
----   ---
   1     8
   2     5
   3    12
   4    12
   5    22

I can \"group by\" to get a count

相关标签:
10条回答
  • 2020-12-07 23:23

    Can you try the below solution:

    SELECT count (1), '1-10'  where age between 1 and 10
    union all 
    SELECT count (1), '11-20'  where age between 11 and 20
    union all
    select count (1), '21+' where age >20
    from age 
    
    0 讨论(0)
  • 2020-12-07 23:25
    SELECT CASE 
             WHEN age <= 10 THEN '1-10' 
             WHEN age <= 20 THEN '11-20' 
             ELSE '21+' 
           END AS age, 
           COUNT(*) AS n
    FROM age
    GROUP BY CASE 
               WHEN age <= 10 THEN '1-10' 
               WHEN age <= 20 THEN '11-20' 
               ELSE '21+' 
             END
    
    0 讨论(0)
  • 2020-12-07 23:32

    If using Oracle 9i+, you might be able to use the NTILE analytic function:

    WITH tiles AS (
      SELECT t.age,
             NTILE(3) OVER (ORDER BY t.age) AS tile
        FROM TABLE t)
      SELECT MIN(t.age) AS min_age,
             MAX(t.age) AS max_age,
             COUNT(t.tile) As n
        FROM tiles t
    GROUP BY t.tile
    

    The caveat to NTILE is that you can only specify the number of partitions, not the break points themselves. So you need to specify a number that is appropriate. IE: With 100 rows, NTILE(4) will allot 25 rows to each of the four buckets/partitions. You can not nest analytic functions, so you'd have to layer them using subqueries/subquery factoring to get desired granularity. Otherwise, use:

      SELECT CASE t.age
               WHEN BETWEEN 1 AND 10 THEN '1-10' 
               WHEN BETWEEN 11 AND 20 THEN '11-20' 
               ELSE '21+' 
             END AS age, 
             COUNT(*) AS n
        FROM TABLE t
    GROUP BY CASE t.age
               WHEN BETWEEN 1 AND 10 THEN '1-10' 
               WHEN BETWEEN 11 AND 20 THEN '11-20' 
               ELSE '21+' 
             END
    
    0 讨论(0)
  • 2020-12-07 23:33

    I had to group data by how many transactions appeared in an hour. I did this by extracting the hour from the timestamp:

    select extract(hour from transaction_time) as hour
          ,count(*)
    from   table
    where  transaction_date='01-jan-2000'
    group by
           extract(hour from transaction_time)
    order by
           extract(hour from transaction_time) asc
    ;
    

    Giving output:

    HOUR COUNT(*)
    ---- --------
       1     9199 
       2     9167 
       3     9997 
       4     7218
    

    As you can see this gives a nice easy way of grouping the number of records per hour.

    0 讨论(0)
提交回复
热议问题