PostgreSQL заставляет данные делиться на интервалы с шагом 5 - PullRequest
1 голос
/ 27 июня 2019

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

Ответы [ 2 ]

1 голос
/ 27 июня 2019

Из вывода, которым вы поделились, кажется, что деление 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
1 голос
/ 27 июня 2019

есть вероятность, что ваш столбец 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...