PostgreSQL заставляет данные попадать в интервалы с шагом 5

У меня есть данные от 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

Помогите нам помочь вам - пожалуйста, поделитесь некоторыми примерами данных, результатом, который вы получаете для этого, и результатом, который вы пытаетесь получить для этого?

Mureinik 27.06.2019 10:17

Готово, добавлено в описание :)

Polly 27.06.2019 10:29
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
2
212
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

есть шанс, что ваш столбец 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

Другие вопросы по теме