2015-12-01 4 views
-1

Предположим, у меня есть столбец ID, который имеет значения 1, 5, 7. Какой оператор SQL я могу использовать для получения следующего значения в столбце на основе другого.Как получить следующее значение и предыдущее значение в столбце

Пример: Следующее значение после того, как 1: 5.

Пример 2: значение до 7 составляет 5

+0

Что произойдет в случае первого и последнего значения таблицы –

+0

Если вы ищете статический результат (т.е. ответ на один, уже известный идентификатор), это так же просто, как «SELECT TOP 1 ID FROM TABLE WHERE ID> 1 ORDER BY ID'. Если нет, вы должны отредактировать свой вопрос, чтобы уточнить тип запроса, который вы хотите выполнить. –

+0

@PareshJ Я ожидаю некоторую ошибку в этом случае – user2650277

ответ

1

без каких-либо функций окна или КТР:

select 
    t.id, 
    (select max(t1.id) from tbl t1 where t1.id < t.id) as previd, 
    (select min(t2.id) from tbl t2 where t2.id > t.id) as nextid 
from tbl t 
0

Есть некоторые большие функции WINDOWED для работы по записям в более поздних версиях SQL Server (2012+). Но в 2008 году они недоступны. Вместо этого вы можете использовать OUTER APPLY. Это позволит вам фильтровать вспомогательный запрос, используя значения из основного запроса.

Outer Apply Query Example

WITH SampleValues AS 
    (
     /* This CTE creates some sample values. 
     */ 
     SELECT 
      r.n 
     FROM 
      (
       VALUES 
        (1), 
        (5), 
        (7) 
      ) AS r(n) 
    ) 
SELECT 
    o.n, 
    prev.Previous_n, 
    [next].Next_n 
FROM 
    SampleValues AS o 
     OUTER APPLY 
      (
       -- Find the previou value by looking for the TOP 1 before the current. 
       SELECT TOP 1 
        o.n  AS Original_n, 
        p.n  AS Previous_n 
       FROM 
        SampleValues AS p 
       WHERE 
        p.n < o.n 
       ORDER BY 
        p.n DESC 
      ) AS prev 
     OUTER APPLY 
      ( 
       -- Find the next value by looking for the TOP 1 after the current. 
       SELECT TOP 1 
        n.n  AS Original_n, 
        n.n  AS Next_n 
       FROM 
        SampleValues AS n 
       WHERE 
        n.n > o.n 
       ORDER BY 
        n.n ASC 
      )AS [next]  
; 
Смежные вопросы