Как получить диапазон между двумя рядами - PullRequest
1 голос
/ 25 марта 2012

Table1

ID Value

001 100
002 125
003 150
004 175
005 200
006 225
...

Ожидаемый результат

  • Если пользователь вводит значение от 100 до 124, тогда в id должно отображаться 001
  • Если пользователь вводит значение от 125 до 149, тогда в id должно отображаться 002

  • Если пользователь вводит значение от 200 до 224, тогда в id должно отображаться 005

  • Если пользователь вводит значение от 225 до 249, тогда в id должно отображаться 006

Как сделать запрос для вышеуказанного условия.

Нужна помощь с запросом

Ответы [ 4 ]

3 голосов
/ 25 марта 2012

Было бы проще написать запрос к преобразованной таблице, такой как ID, ValueFrom, ValueTo.

Для этой таблицы:

SELECT MAX(ID)
FROM Table1
WHERE Value <= @value

В основном, если введено 155, возвращены идентификаторы 1, 2 и 3, то берется МАКС. ИД (3), который является ответом.

2 голосов
/ 26 марта 2012

Вот, пожалуйста:

Сначала создайте тестовую таблицу:

CREATE TABLE #Temp(ID INT, Val INT)
INSERT INTO #Temp VALUES(1, 100);
INSERT INTO #Temp VALUES(2, 125);
INSERT INTO #Temp VALUES(3, 150);
INSERT INTO #Temp VALUES(4, 175);
INSERT INTO #Temp VALUES(5, 200);
INSERT INTO #Temp VALUES(6, 225);

Установите значение теста

DECLARE @value INT
SET @value = 125

Если идентификатор последовательный (то есть 1, 2, 3, 4, 5 и т. Д.)

SELECT t1.id
FROM #Temp t1, #Temp t2
WHERE t1.ID = t2.ID -1
AND @value BETWEEN t1.Val AND t2.Val -1

Если идентификатор не последовательный (то есть 1, 2, 5, 7, 8 и т. Д.)

;WITH cte AS (SELECT ROW_NUMBER() OVER (ORDER BY id) AS rownum, ID, Val FROM #Temp)
SELECT t1.id
FROM cte t1, cte t2
WHERE t1.rownum = t2.rownum -1
AND @value BETWEEN t1.Val AND t2.Val -1
2 голосов
/ 25 марта 2012

Получить наиболее близкое совпадение и вернуть первую строку, предварительно отсортировав ее по значению:

select top 1 id 
from range
where value <= @value
order by value desc

Или, если вам нужно включить этот запрос в другой:

select id
  from range
 where value = (select max(value) from range where value <= @value)
0 голосов
/ 25 марта 2012

Использовать CASE в операторе SELECT ....

Например:

declare @c int;
set @c=120;
SELECT
    CASE 
    WHEN @c BETWEEN 100 AND 124 THEN '001'
    WHEN @c BETWEEN 125 AND 149 THEN '002'
    ELSE 'Other'
END
...