SQL — выделяет столбец целых чисел и подсчитывает каждое ведро

#mysql #sql #postgresql

#mysql #sql #postgresql

Вопрос:

У меня есть целочисленный столбец, как показано ниже.

 ID
---
1
2
3
..
..
99
100
 

Я хочу разделить это на 10 рядов.

 100 rows/10 buckets = 10 different buckets 
 

Я хочу подсчитать количество строк из каждого ведра.

 id    | total rows
----------------
1-10  | 10
11-20 | 10
21-30 | 10
...   | ..
...   | ..
91-100| 10
 

Я пытаюсь реализовать это с помощью Postgresql и MySQL.

Ответ №1:

Вы можете использовать truncate функцию следующим образом:

 Select concat(min(id),'-',max(id)) as ids, count(1) as total_rows
  From your_table t
Group by truncate(id-1, -1)   
 

Ответ №2:

В mysql:

 select
    concat(min((id-1) div 10) * 10   1, '-', min((id-1) div 10) * 10   10) 'id',
    count(id) 'total rows'
from yourtable
group by (id-1) div 10
 

В postgres:

 select
    (min((id-1) / 10) * 10   1) || '-' || (min((id-1) / 10) * 10   10) as id,
    count(id) as total_rows
from yourtable
group by (id-1) / 10
order by (id-1) / 10
 

Ответ №3:

Вы можете попробовать использовать выражение case

 select case 
        when id between 1 and 10 then '1-10'
        when id between 11 and 20 then '11-20'
        when id between 21 and 30 then '21-30' end as id, count(*) as total_rows
from tablename
group by case 
          when id between 1 and 10 then '1-10'
          when id between 11 and 20 then '11-20'
          when id between 21 and 30 then '21-30' end
 

Ответ №4:

Как в Postgres, так и в MySQL должно работать следующее:

 select concat_ws('-', ceiling(id / 10.0) * 10 - 9, ceiling(id / 10.0) * 10) as id_range,
       count(*)
from t
group by id_range
order by min(id);
 

В дополнение к тому, что он одинаков в обеих базах данных, я также думаю, что это, пожалуй, самая простая конструкция в любой базе данных.

Вот две скрипты db<>: для Postgres и для MySQL.