У меня есть данные от 1 до N, и мне нужно сделать так, чтобы они попали в интервалы с шагом пять. Например, каждый элемент с 1 по 5 попадает в интервал 1, с 6 по 10 — в интервал 2 и так далее до конца.
Я сделал это, чтобы найти интервалы, но у каждого нового числа, похоже, есть свой собственный интервал. Кто-нибудь может помочь?
select distinct Meters, (Meters/5)*5 || '-' || (Meters/5)*5+5 as Meters_range
from v_temp_schema.tmp_split_data
order by 1
Выход:
Meters Interval
1 1-6
2 2-7
3 3-8
4 4-9
9 9-14
6 6-11
11 11-16
8 8-13
34 34-39
.........
78 78-83
15 15-20
81 81-86
Выход мне нужен:
Meters Interval
1 1-5
2 1-5
3 1-5
4 1-5
9 6-10
6 6-10
11 11-15
8 6-10
34 31-35
.........
78 76-80
15 11-15
81 81-85
Готово, добавлено в описание :)


есть шанс, что ваш столбец meters не является целым числом, поэтому целочисленное деление не работает, вы должны убедиться, что это целое число... этот запрос вернул мне правильный результат (я только что сгенерировал ряд целых чисел для смоделируйте значения meters, убедитесь, что у вас есть часть ::int рядом с meters либо в вашей формуле, либо в подзапросе
select
meters
,(meters/5)*5+1 || '-' || (meters/5)*5+5 as interval
from (
select generate_series (1,100,1)::int as meters
) m
Из вывода, которым вы поделились, кажется, что деление meters / 5 выполняется как деление с плавающей запятой, поэтому деление, а затем умножение на 5 просто возвращает одно и то же значение. Вы можете floor получить результат, чтобы он действовал как целочисленное деление:
SELECT DISTINCT meters, FLOOR(meters/5) * 5 || '-' || FLOOR(meters/5) * 5 + 5 AS Meters_range
-- Here ------------------^-----------------------------^
FROM v_temp_schema.tmp_split_data
ORDER BY 1
Помогите нам помочь вам - пожалуйста, поделитесь некоторыми примерами данных, результатом, который вы получаете для этого, и результатом, который вы пытаетесь получить для этого?