Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Функция ранжирования / 3 сообщений из 3, страница 1 из 1
10.02.2019, 19:12
    #39771900
jango77
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция ранжирования
Добрый день
Помогите пож составить ранжирование таким образом, чтобы в рамках каждого дня и каждого специалиста ранжировались часы в рамках не прерывного диапазона (получить значения как в поле rank )

Составил запрос, дальше не могу продвинуться

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
  WITH CTE AS (
    SELECT
          t.id as 'technician_id'
         ,s.date
         ,s.time_from
         ,CAST(s.time_from AS TIME) as 'hour'
         ,ROW_NUMBER() OVER(PARTITION BY t.id, s.date ORDER BY s.time_from) as 'rn'

    FROM time s
    INNER JOIN technic t ON s.technician = t.id
    WHERE s.schedule IS NULL
  )


  SELECT
     c1.*
    ,RANK() over (PARTITION BY c1.technician_id , c1.date, IFNULL(TIMESTAMPDIFF(hour, c2.hour, c1.hour), 1) ORDER BY c1.time_from) as 'megarank'

  FROM CTE c1
  LEFT JOIN CTE c2 ON c1.technician_id = c2.technician_id
                  AND c1.date = c2.date
                  AND c1.rn = c2.rn + 1


technician_iddatetime_fromhourrnrank4613102019-02-102019-02-10 12:00:0012:00:00114613102019-02-112019-02-11 10:00:0010:00:00134613102019-02-112019-02-11 11:00:0011:00:00224613102019-02-112019-02-11 12:00:0012:00:00314613102019-02-112019-02-11 15:00:0015:00:00424613102019-02-112019-02-11 16:00:0016:00:00514613102019-02-112019-02-11 18:00:0018:00:00634613102019-02-112019-02-11 19:00:0019:00:00724613102019-02-112019-02-11 20:00:0020:00:0081
...
Рейтинг: 0 / 0
11.02.2019, 04:49
    #39771977
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция ранжирования
jango77,
Код: 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.
27.
28.
29.
30.
31.
-- Ваши исходные данные:
with
  [time] (id, [date], time_from) as
    (
      select i, cast(d as date) as d, cast(t as datetime) as t
        from (values
                (461310,'2019-02-10','2019-02-10 12:00:00'),
                (461310,'2019-02-11','2019-02-11 10:00:00'),
                (461310,'2019-02-11','2019-02-11 11:00:00'),
                (461310,'2019-02-11','2019-02-11 12:00:00'),
                (461310,'2019-02-11','2019-02-11 15:00:00'),
                (461310,'2019-02-11','2019-02-11 16:00:00'),
                (461310,'2019-02-11','2019-02-11 18:00:00'),
                (461310,'2019-02-11','2019-02-11 19:00:00'),
                (461310,'2019-02-11','2019-02-11 20:00:00')
             ) v(i,d,t)
    )
--
-- Один из возможных вариантов запроса:
select id as technician_id
     , [date]
     , time_from
     , cast(time_from as time) as [hour]
     , row_number() over(partition by id, date, grp_id order by time_from desc) as megarank
  from (
         select s.*
             -- Ключевой момент запроса:
              , datepart(hour, time_from) - row_number()over(partition by id, date order by time_from) as grp_id 
           from [time] as s
       ) as v
 order by id, time_from
...
Рейтинг: 0 / 0
11.02.2019, 12:53
    #39772171
jango77
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Функция ранжирования
Анна, Спасибо Вам!
Это то что нужно!
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Функция ранжирования / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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