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

Откуда:
Сообщений: 14
Добрый день, всем.
Есть таблица:
ID| Cost | Change
1 | 450 | 0
2 | 340 | 1
3 | 470 | 0
4 | 570 | 1
5 | 600 | 1
Есть ли способ, которым можно вывести строки по чередующимся значениям в столбце Change помимо "курсора"? (на данном примере строки:1,2,3). При попытке использования inner join'a выдает значения 0 1 0 1 1 0, т.к. четвертая строка <> третьей, но шестая строка также отлична от пятой, поэтому чередование не получается сделать. Буду рад любым подсказкам.
24 авг 15, 12:00    [18059247]     Ответить | Цитировать Сообщить модератору
 Re: Вывод строк с чередующимися значениями  [new]
o-o
Guest
в предыдущей теме вам уже присоветовали lead/lag.
вы успешно проигнорировали + версию сервера так и не огласили
24 авг 15, 12:03    [18059275]     Ответить | Цитировать Сообщить модератору
 Re: Вывод строк с чередующимися значениями  [new]
o-o
Guest
declare @t table (ID int, Cost int, Change int);
insert into @t values
(1 , 450 , 0),
(2 , 340 , 1),
(3 , 470 , 0),
(4 , 570 , 1),
(5 , 600 , 1)

select t1.*, t2.Change as next_change
from @t t1 left join @t t2 on t2.ID = t1.ID + 1
where t1.Change <> t2.Change;
24 авг 15, 12:12    [18059321]     Ответить | Цитировать Сообщить модератору
 Re: Вывод строк с чередующимися значениями  [new]
RUSSIANBEAR7
Member

Откуда:
Сообщений: 14
o-o
в предыдущей теме вам уже присоветовали lead/lag.
вы успешно проигнорировали + версию сервера так и не огласили


Прошу прощения, версия 2012, но lead/lag'ом не умею пользоваться. Решил столбец новый создать, в которое записывается 1,0 в зависимости от знака
24 авг 15, 12:12    [18059322]     Ответить | Цитировать Сообщить модератору
 Re: Вывод строк с чередующимися значениями  [new]
o-o
Guest
2012:
with cte as 
(
select *, lead(change) over(order by id) as next_change
from @t
) 
select * from cte
where change <> next_change
24 авг 15, 12:17    [18059344]     Ответить | Цитировать Сообщить модератору
 Re: Вывод строк с чередующимися значениями  [new]
RUSSIANBEAR7
Member

Откуда:
Сообщений: 14
o-o
2012:
with cte as 
(
select *, lead(change) over(order by id) as next_change
from @t
) 
select * from cte
where change <> next_change

Спасибо большое,но с помощью with не получится, таблица очень большая (>500000 строк). С помощью inner join выводит не чередующиеся значения как в моем посте
24 авг 15, 12:53    [18059510]     Ответить | Цитировать Сообщить модератору
 Re: Вывод строк с чередующимися значениями  [new]
o-o
Guest
1. какая разница CTE, сколько строк?
2. в вашем посте в ответе 1, 2, 3.
и оба решения выводят то же самое.
что с этим не так?
24 авг 15, 12:56    [18059544]     Ответить | Цитировать Сообщить модератору
 Re: Вывод строк с чередующимися значениями  [new]
o-o
Guest
если у вас "чередование" это не когда разнится со следующим,
а когда отличается от предыдущего (а для первого "всегда", т.к. предыдущего просто нет),
то используйте "следующий", а не "предыдущий" в сравнении:
declare @t table (ID int, Cost int, Change int);
insert into @t values
(1 , 450 , 0),
(2 , 340 , 1),
(3 , 470 , 0),
(4 , 570 , 1),
(5 , 600 , 1);

select t1.*, t2.Change as prev_change
from @t t1 left join @t t2 on t2.ID = t1.ID - 1
where t1.Change <> isnull(t2.Change, -1);

with cte as 
(
select *, lag(change, 1, -1) over(order by id) as prev_change
from @t
) 
select * from cte
where change <> prev_change

если и это не то, то сформулируйте нормально условие "чередования"
24 авг 15, 13:06    [18059618]     Ответить | Цитировать Сообщить модератору
 Re: Вывод строк с чередующимися значениями  [new]
RUSSIANBEAR7
Member

Откуда:
Сообщений: 14
o-o
1. какая разница CTE, сколько строк?
2. в вашем посте в ответе 1, 2, 3.
и оба решения выводят то же самое.
что с этим не так?


Спасибо большое, выручили!!!
24 авг 15, 13:45    [18059863]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить