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

Откуда: Тверь
Сообщений: 882
Привет!
Есть таблица с одним полем ID, значения например такие
1
2
5
3
4
нужно получить результат запроса с двумя полями
1-2
2-5
5-3
3-4
Придумал такой странный способ, может есть вариант поумней?
declare @t table(id int)

insert @t(id)
values (1),(2),(5),(3),(4)

select b.id, a.id
from (select 
         ROW_NUMBER() OVER (ORDER BY aa.ID) as num
	,aa.id 
	from @t aa)as a
join (select 
       ROW_NUMBER() OVER (ORDER BY bb.ID) as num
      ,bb.id 
      from @t bb) b on a.num=b.num+1 
1 июн 15, 13:32    [17715171]     Ответить | Цитировать Сообщить модератору
 Re: Превратить последовательность в парную последовательность  [new]
Кролик-зануда
Guest
PG81,

ваш запрос не вернет тот результат, который вы озвучили как нужный.
будет
1-2
2-3
3-4
4-5


если же сортировка корректная, то почему бы не задействовать lead/lag?
или версия сервера не позволяет?
1 июн 15, 13:44    [17715256]     Ответить | Цитировать Сообщить модератору
 Re: Превратить последовательность в парную последовательность  [new]
invm
Member

Откуда: Москва
Сообщений: 9824
with a as
(
 select
  id, lead(id) over (order by id) as num
 from
  @t
)
select * from a where num is not null;
1 июн 15, 13:46    [17715268]     Ответить | Цитировать Сообщить модератору
 Re: Превратить последовательность в парную последовательность  [new]
Павел Воронцов
Member

Откуда: Новосибирск
Сообщений: 2392
Блог
PG81
Привет!
Есть таблица с одним полем ID, значения например такие
1
2
5
3
4
нужно получить результат запроса с двумя полями
1-2
2-5
5-3
3-4
Придумал такой странный способ, может есть вариант поумней?
не взлетит. Нужен признак, задающий порядок обхода.
1 июн 15, 13:48    [17715283]     Ответить | Цитировать Сообщить модератору
 Re: Превратить последовательность в парную последовательность  [new]
o-o
Guest
Кролик прав,
если нет задающего правильную сортировку поля,
никакой lead не спасет и не будет
2-5
5-3
1 июн 15, 13:48    [17715285]     Ответить | Цитировать Сообщить модератору
 Re: Превратить последовательность в парную последовательность  [new]
Glory
Member

Откуда:
Сообщений: 104751
PG81
Есть таблица с одним полем ID, значения например такие
1
2
5
3
4

И что гарантирует такой порядок ?
1 июн 15, 13:48    [17715286]     Ответить | Цитировать Сообщить модератору
 Re: Превратить последовательность в парную последовательность  [new]
PG81
Member

Откуда: Тверь
Сообщений: 882
Glory,

ну давайте введем еще поле порядок, которое гарантирует такой порядок,
чет я об этом не подумал
(а мой запрос действительно выдает неверный результат((()
1 июн 15, 14:02    [17715375]     Ответить | Цитировать Сообщить модератору
 Re: Превратить последовательность в парную последовательность  [new]
Glory
Member

Откуда:
Сообщений: 104751
PG81
ну давайте введем еще поле порядок, которое гарантирует такой порядок,
чет я об этом не подумал

Тогда просто для каждой записи найдите первую запись с большим номером по порядку
1 июн 15, 14:04    [17715389]     Ответить | Цитировать Сообщить модератору
 Re: Превратить последовательность в парную последовательность  [new]
PG81
Member

Откуда: Тверь
Сообщений: 882
declare @t table(n int,id int)

insert @t(n,id)
values (1,1),(2,2),(3,5),(4,3),(5,4)

select 
 a.n 
,a.id
,b.id 
from @t a
outer apply(select bb.id
  from @t bb 
  where bb.n=a.n+1
  )b
where not b.id is null 
1 июн 15, 14:16    [17715468]     Ответить | Цитировать Сообщить модератору
 Re: Превратить последовательность в парную последовательность  [new]
Кролик-зануда
Guest
PG81,
садо-мазо?
...
outer apply
...
where not b.id is null 
1 июн 15, 14:20    [17715491]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить