2012-03-25 4 views
1

TABLE1Как получить диапазон между двумя рядами

ID Value 

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

Ожидаемый выход

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

  • Если пользователь вводит значение от 200 до 224, тогда id sho ULD дисплей 005

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

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

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

+0

Могут ли идентификаторы когда-либо из порядка? Может ли что-то произойти в будущем, когда строка 7 имеет значение 75? – MatBailie

ответ

2

Здесь вы идете:

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

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 

Если ID последователен (т.е. 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 

Если ID не последовательный (т.е. 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 
3

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

В этой таблице:

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

В принципе, если 155 вводится, идентификаторы 1 2 и 3 возвращаются, то MAX ID берется (3), который является ответом.

+1

Я согласен с SQL, считая, что значения всегда в порядке. Но я полностью не согласен с первым предложением. С индексом «значение, id» в текущей таблице вы получаете максимально возможную производительность; с тем же предположением порядка. – MatBailie

0

Использование СЛУЧАЙ в ЗЕЬЕСТ ....

Например:

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 
+1

Этот ответ не использует таблицу базы данных. Предлагаете ли вы менять код каждый раз, когда изменяются значения в таблице? – MatBailie

2

Получить ближайший матч и вернуть первую строку ранее сортировка по значению:

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

+1: Дает OP желаемый результат и не предполагает, что идентификаторы всегда в порядке. – MatBailie

Смежные вопросы