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

Откуда:
Сообщений: 25
Добрый день
Помогите пож составить ранжирование таким образом, чтобы в рамках каждого дня и каждого специалиста ранжировались часы в рамках не прерывного диапазона (получить значения как в поле rank)

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

  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_fromhourrnrank
4613102019-02-102019-02-10 12:00:0012:00:0011
4613102019-02-112019-02-11 10:00:0010:00:0013
4613102019-02-112019-02-11 11:00:0011:00:0022
4613102019-02-112019-02-11 12:00:0012:00:0031
4613102019-02-112019-02-11 15:00:0015:00:0042
4613102019-02-112019-02-11 16:00:0016:00:0051
4613102019-02-112019-02-11 18:00:0018:00:0063
4613102019-02-112019-02-11 19:00:0019:00:0072
4613102019-02-112019-02-11 20:00:0020:00:0081
10 фев 19, 19:12    [21805783]     Ответить | Цитировать Сообщить модератору
 Re: Функция ранжирования  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1254
jango77,
-- Ваши исходные данные:
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
11 фев 19, 04:49    [21806015]     Ответить | Цитировать Сообщить модератору
 Re: Функция ранжирования  [new]
jango77
Member

Откуда:
Сообщений: 25
Анна, Спасибо Вам!
Это то что нужно!
11 фев 19, 12:53    [21806291]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить