powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / помогите, пожалуйста, составить ранг
7 сообщений из 7, страница 1 из 1
помогите, пожалуйста, составить ранг
    #39647415
Nemoxur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день,
помогите, пожалуйста, составить ранг

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
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 dtend1'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'



Спасибо!
...
Рейтинг: 0 / 0
помогите, пожалуйста, составить ранг
    #39647419
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nemoxur,

STFF
...
Рейтинг: 0 / 0
помогите, пожалуйста, составить ранг
    #39647420
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
помогите, пожалуйста, составить ранг
    #39647424
Nemoxur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Анна,

Спасибо, буду разбираться.
...
Рейтинг: 0 / 0
помогите, пожалуйста, составить ранг
    #39647457
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nemoxur,

первое, что пришло в голову:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
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-подзапросов
...
Рейтинг: 0 / 0
помогите, пожалуйста, составить ранг
    #39647494
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина АннаЕсли версия сервера позволяет - можно переписать на LEAD/LAG, но суть от этого сильно не поменяется.Получилось сильно короче и с меньшим числом использования оконных функций:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
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
...
Рейтинг: 0 / 0
помогите, пожалуйста, составить ранг
    #39647614
Nemoxur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Анна,

Спасибо, Анна.
с lag() то что нужно.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / помогите, пожалуйста, составить ранг
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]