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

Откуда:
Сообщений: 53
Всем привет!

Имею версию 10.50.2550. На данной версии отсутствует возможность выполнения LEAD и LAG, а они нужны.

Апнуть версию не вариант, поэтому прошу подсказать как реализовать выполнение функции LEAD в примере ниже.

Показать следующий статус в рамках одного телефона.

---phone----------status---next status
+79981234567--ring------ring
+79981234567--ring------no ring
+79981234567--no ring--in work
+79981234567--in work--
+79981234568--ring------in work
+79981234568--in work--no ring
+79981234568--no ring--
+79981234569--in work--in work
+79981234569--in work--

Имеются попытки это сделать через row_number + case when..., но всё не то.




Посоветуйте как реализовать функцию Lead на
29 ноя 17, 16:42    [20992832]     Ответить | Цитировать Сообщить модератору
 Re: Реализация функции Lead на версии, которая её не поддерживает  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
какой case?
row_number() + self join on rn = rn + 1
29 ноя 17, 16:51    [20992878]     Ответить | Цитировать Сообщить модератору
 Re: Реализация функции Lead на версии, которая её не поддерживает  [new]
aleks222
Guest
Yasha123
какой case?
row_number() + self join on rn = rn + 1


на факт, что нумерация всего быстрее, чем

outer apply ( select top(1) ...)


ЗЫ. И как челевечество существовало до LEAD и LAG?
29 ноя 17, 16:57    [20992901]     Ответить | Цитировать Сообщить модератору
 Re: Реализация функции Lead на версии, которая её не поддерживает  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
declare @t table (id int identity, phone bigint, status varchar(100));
insert into @t(phone, status) values
(79981234567, 'ring'), 
(79981234567, 'ring'),
(79981234567, 'no ring'),
(79981234567, 'in work'), 
(79981234568, 'ring'),
(79981234568, 'in work'),
(79981234568, 'no ring'),
(79981234569, 'in work'),
(79981234569, 'in work');

with cte as
(
select *,
       row_number() over(partition by phone order by id) as rn
from @t
)

select c1.*, isnull(c2.status, '--') as next_status
from cte c1 left join cte c2
     on c1.phone = c2.phone and c2.rn = c1.rn + 1;
29 ноя 17, 16:59    [20992919]     Ответить | Цитировать Сообщить модератору
 Re: Реализация функции Lead на версии, которая её не поддерживает  [new]
svanrus
Member

Откуда:
Сообщений: 53
Yasha123,

Спасибо!
5 дек 17, 15:19    [21007684]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить