Есть ли способ создать диапазон из столбца таблицы со случайным значением - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь получить диапазон, в который будет падать число, диапазон будет создан из значений столбца таблицы, например. пусть будет столбец 'num1', который содержит данные (12,15,10,40,20,5), и я даю 23 в качестве числа для поиска, тогда я могу получить выходные данные как '20 и 40'

я могу получить желаемый результат двумя запросами, но хочу иметь один запрос, Столбец будет иметь уникальные значения, поэтому, если значение столбца совпадает, то диапазон будет числом, а его ближайшее меньшее значение для ex. если вход 15, то выход будет 12 и 15 Значение столбца: (12,15,10,40,20,5) значение поиска: 30 желаемый результат: '20 и 40 '

1 Ответ

0 голосов
/ 14 июня 2019

Возможно, что-то подобное сработает в вашу пользу. Использование оконных функций LEAD () И LAG () для получения предыдущего и следующего значений строки.

Sql Fiddle

DECLARE @T TABLE(Number INT)
INSERT @T VALUES(12),(15),(10),(40),(20),(5)

SELECT 
  Number,
  NextNumber = ISNULL(LEAD(Number) OVER (PARTITION BY 1 ORDER BY Number),Number),
  LastNumber = ISNULL(LAG(Number) OVER (PARTITION BY 1 ORDER BY Number),Number)
FROM 
   T

Из таблицы нарастания вам необходимо сопоставить входные данные в допустимых диапазонах и выбрать наилучшее соответствие (в этом случае оно ближе всего к началу / концу диапазона).

DECLARE @NumberToSearch INT =23

;WITH Ranges AS
(
    SELECT 
        Number,
        RangeStart = ISNULL(LAG(Number) OVER (PARTITION BY 1 ORDER BY Number) ,Number), 
        RangeEnd = ISNULL(LEAD(Number) OVER (PARTITION BY 1 ORDER BY Number) , Number)
    FROM 
        @T
)
,ApplicableRanges AS
(
    SELECT 
        Number,
        RangeStart,
        RangeEnd,
        Instance = ROW_NUMBER() OVER(PARTITION BY 1 ORDER BY  RangeStart)
    FROM
        Ranges R
    WHERE
        @NumberToSearch BETWEEN R.RangeStart AND R.RangeEnd
)

SELECT * FROM ApplicableRanges WHERE Instance = 1
...