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

Откуда:
Сообщений: 176
Добрый день,
помогите, пожалуйста, составить ранг

declare @tbl table (id int, type int, dtStart DATE, dtEnd DATE);

INSERT INTO @TBL (id, type, dtstart, dtend) 
SELECT 1, 0, '2018-05-01', '2018-05-03' 
UNION ALL 
SELECT 2, 1, '2018-05-03', '2018-05-05' 
UNION ALL 
SELECT 3, 0, '2018-05-05', '2018-05-08' 
UNION ALL 
SELECT 4, 0, '2018-05-08', '2018-05-10'
UNION ALL
SELECT 5, 0,'2018-05-10','2018-05-15'




Нужно получить ранг такого вида:
rank dtStart dtend
1'2018-05-01''2018-05-03'
2'2018-05-03''2018-05-05'
3'2018-05-05''2018-05-08'
3'2018-05-08''2018-05-10'
3'2018-05-10''2018-05-15'




Спасибо!
21 май 18, 10:08    [21424821]     Ответить | Цитировать Сообщить модератору
 Re: помогите, пожалуйста, составить ранг  [new]
Щукина Анна
Member

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

STFF
21 май 18, 10:13    [21424841]     Ответить | Цитировать Сообщить модератору
 Re: помогите, пожалуйста, составить ранг  [new]
Щукина Анна
Member

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

из недавнего
21 май 18, 10:16    [21424850]     Ответить | Цитировать Сообщить модератору
 Re: помогите, пожалуйста, составить ранг  [new]
Nemoxur
Member

Откуда:
Сообщений: 176
Щукина Анна,

Спасибо, буду разбираться.
21 май 18, 10:28    [21424912]     Ответить | Цитировать Сообщить модератору
 Re: помогите, пожалуйста, составить ранг  [new]
Щукина Анна
Member

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

первое, что пришло в голову:
declare @tbl table (id int, type int, dtStart DATE, dtEnd DATE)
INSERT INTO @TBL (id, [type], dtstart, dtend) 
values 
(1, 0, '2018-05-01', '2018-05-03'),
(2, 1, '2018-05-03', '2018-05-05'),
(3, 0, '2018-05-05', '2018-05-08'),
(4, 0, '2018-05-08', '2018-05-10'),
(5, 0,'2018-05-10','2018-05-15')


select x_dense_rnk = sum(x_start_of_group) over(order by id)
     , id, [type], dtstart, dtend, x_group_id 
from   (
         select x_start_of_group = case row_number() 
                                              over(partition by x_group_id, [type] order by id) 
                                   when 1 then 1 
                                   else 0 end
              , id, [type], dtstart, dtend, x_group_id
         from   (
                  select id, [type], dtstart, dtend 
                       , x_group_id = row_number() over(partition by [type]order by id)
                                      - row_number() over(order by id)
                  from   @tbl
                ) v
       ) v
order  by id

Если версия сервера позволяет - можно переписать на LEAD/LAG, но суть от этого сильно не поменяется.
Как вариант - двигаться в сторону [cross | outer] apply-подзапросов
21 май 18, 11:21    [21425206]     Ответить | Цитировать Сообщить модератору
 Re: помогите, пожалуйста, составить ранг  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1467
Щукина Анна
Если версия сервера позволяет - можно переписать на LEAD/LAG, но суть от этого сильно не поменяется.
Получилось сильно короче и с меньшим числом использования оконных функций:
declare @tbl table (id int, type int, dtStart DATE, dtEnd DATE)
INSERT INTO @TBL (id, [type], dtstart, dtend) 
values 
(1, 0, '2018-05-01', '2018-05-03'),
(2, 1, '2018-05-03', '2018-05-05'),
(3, 0, '2018-05-05', '2018-05-08'),
(4, 0, '2018-05-08', '2018-05-10'),
(5, 0,'2018-05-10','2018-05-15')


select x_dense_rnk = sum(x_start_of_group) over(order by id)
     , id, [type], dtstart, dtend
from   (
         select id, [type], dtstart, dtend 
                  , x_start_of_group = case lag([type]) over(order by id) when [type] then 0 else 1 end
         from   @tbl
        
       ) v
order  by id
21 май 18, 11:59    [21425367]     Ответить | Цитировать Сообщить модератору
 Re: помогите, пожалуйста, составить ранг  [new]
Nemoxur
Member

Откуда:
Сообщений: 176
Щукина Анна,

Спасибо, Анна.
с lag() то что нужно.
21 май 18, 15:16    [21426217]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить