У меня есть целочисленный столбец, как показано ниже.
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.
Вы можете попробовать использовать выражение 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
Вы можете использовать функцию truncate
следующим образом:
Select concat(min(id),'-',max(id)) as ids, count(1) as total_rows
From your_table t
Group by truncate(id-1, -1)
В майкл:
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
В постгресе:
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
И в 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.