Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Создать запрос, который возвращает предыдущую и последующую записи  [new]
pina colada
Member

Откуда:
Сообщений: 19
Добрый день!
Есть таблица с одним полем. Записи этой таблицы - числа, представленные в произвольном порядке. (например, 56, 22, 98, 11, 76....).
Необходимо получить числа следующие за и после выбранного.
2 апр 13, 13:40    [14126330]     Ответить | Цитировать Сообщить модератору
 Re: Создать запрос, который возвращает предыдущую и последующую записи  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
автор
за и после выбранного.

ето как ? И сколько чисел должно быть то ??? Как число передаеться то ? Чем просто order by не устроил ?
2 апр 13, 13:43    [14126352]     Ответить | Цитировать Сообщить модератору
 Re: Создать запрос, который возвращает предыдущую и последующую записи  [new]
pina colada
Member

Откуда:
Сообщений: 19
Maxx,
Каждое число - это отдельная запись. Допустим:
44
56
99
23

Выбрали число 99 - в результате нужно получить 56 и 23 (записи идущие перед и после 99)
2 апр 13, 13:47    [14126383]     Ответить | Цитировать Сообщить модератору
 Re: Создать запрос, который возвращает предыдущую и последующую записи  [new]
Glory
Member

Откуда:
Сообщений: 104751
pina colada
Выбрали число 99

Выбрали где ? В уме ? В своем приложении ?
2 апр 13, 13:48    [14126390]     Ответить | Цитировать Сообщить модератору
 Re: Создать запрос, который возвращает предыдущую и последующую записи  [new]
pina colada
Member

Откуда:
Сообщений: 19
Glory, пусть будет в уме. Пользователь мне сказал, меня интересует это число - верни мне записи, следующие после и перед этим числом
2 апр 13, 13:50    [14126403]     Ответить | Цитировать Сообщить модератору
 Re: Создать запрос, который возвращает предыдущую и последующую записи  [new]
angel_zar
Member

Откуда: Барнаул
Сообщений: 902
Сервер не гарантирует, порядок возвращения строк, без использования ORDER BY, и при отсутствии таких полей, по одному полю, если что то и получится, то это будет не гарантированный результат
2 апр 13, 13:54    [14126434]     Ответить | Цитировать Сообщить модератору
 Re: Создать запрос, который возвращает предыдущую и последующую записи  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
pina colada
Пользователь мне сказал, меня интересует это число - верни мне записи, следующие после и перед этим числом
Пользователь должен указать критерий порядка записей, у вас же:
pina colada
числа, представленные в произвольном порядке
2 апр 13, 13:55    [14126439]     Ответить | Цитировать Сообщить модератору
 Re: Создать запрос, который возвращает предыдущую и последующую записи  [new]
pina colada
Member

Откуда:
Сообщений: 19
alexeyvg,
нет никакого порядка - рандомный порядок.
2 апр 13, 13:57    [14126448]     Ответить | Цитировать Сообщить модератору
 Re: Создать запрос, который возвращает предыдущую и последующую записи  [new]
SergePnb
Member

Откуда: Киев
Сообщений: 456
pina colada,

Вот вам просто как тема к размышлению, не более того, только вот эта часть (order by (select 0)) должна быть заменена на тот порядок который вам нужен и о чем справедлимо говорилось выше

declare @tt table (i int)
insert into @tt(i) values (44),(56),(99),(23)
declare @ChosenOne int = 99

;with rnk as (
   select 
      i
     ,RN = row_number() over(order by (select 0))
   from @tt
)
select i
from rnk
where RN in (
  (select rn
   from rnk
   where i = @ChosenOne) - 1
 ,(select rn
   from rnk
   where i = @ChosenOne) + 1
) 
2 апр 13, 13:59    [14126474]     Ответить | Цитировать Сообщить модератору
 Re: Создать запрос, который возвращает предыдущую и последующую записи  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
declare @t table (i int)
insert into @t (i) values (1),(3),(0),(4),(8)
;with cte1 as (
   select i , rn = ROW_NUMBER()over (order by i ) from @t
)
select c2.i, c1.i, c3.i
from cte1 c1
  inner join cte1 c2 on c1.rn -1 = c2.rn
  inner join cte1 c3 on c3.rn +1 = c2.rn
where c1.i = 3   

ну если савсем в тупую
2 апр 13, 14:02    [14126503]     Ответить | Цитировать Сообщить модератору
 Re: Создать запрос, который возвращает предыдущую и последующую записи  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
SergePnb,

может, мы имеем дело с SQL2012?
Тогда есть функции LAG() и LEAD().

Интересно также, что ожидается, если запись первая или последняя
(нет либо предыдущей либо следующей записи).

Это всё, разумеется, если задан порядок записей.
Иначе можно вернуть любые две записи и сказать, что именно они и оказались "пердыдущей" и "следующей"!
2 апр 13, 14:06    [14126527]     Ответить | Цитировать Сообщить модератору
 Re: Создать запрос, который возвращает предыдущую и последующую записи  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
iap
Иначе можно вернуть любые две записи и сказать, что именно они и оказались "пердыдущей" и "следующей"!

таки да
2 апр 13, 14:11    [14126552]     Ответить | Цитировать Сообщить модератору
 Re: Создать запрос, который возвращает предыдущую и последующую записи  [new]
SergePnb
Member

Откуда: Киев
Сообщений: 456
iap,

Боюсь, с чем мы имеем дело мы так и не узнаем. Хотя есть подозрение что где-то "под капотом" там все как должно - и select @@version, и PK, и какой-то порядок сортировки, просто ТС нам этого не говорит
2 апр 13, 14:14    [14126573]     Ответить | Цитировать Сообщить модератору
 Re: Создать запрос, который возвращает предыдущую и последующую записи  [new]
pina colada
Member

Откуда:
Сообщений: 19
iap,
да естественно порядок какой-то задан. Имелось в виду, что числа расположены не по возрастанию и не по убываюния. Функции lag и lead это похоже то, что нужно. спасибо)
2 апр 13, 15:19    [14126928]     Ответить | Цитировать Сообщить модератору
 Re: Создать запрос, который возвращает предыдущую и последующую записи  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
pina colada,

бурные авации из зала
2 апр 13, 15:23    [14126947]     Ответить | Цитировать Сообщить модератору
 Re: Создать запрос, который возвращает предыдущую и последующую записи  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
pina colada
alexeyvg,
нет никакого порядка - рандомный порядок.
Тогда можно брать любые три записи, включая заданную, потому что любые две записи подходят под определение "одна впереди, одна сзади"
2 апр 13, 17:35    [14127789]     Ответить | Цитировать Сообщить модератору
 Re: Создать запрос, который возвращает предыдущую и последующую записи  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31949
pina colada
да естественно порядок какой-то задан.
А, понял, наддо сразу полнее описывать.
2 апр 13, 17:36    [14127798]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить