Как превратить данные ранжирования времени в «временную шкалу» с помощью T-SQL - PullRequest
3 голосов
/ 21 июня 2011

У меня есть набор данных ниже

        Agent   Rank    START   STOP    CODE
        Joey    52      11:30   11:45   BRK_Break1
        Joey    53      17:30   17:45   BRK_Break2
        Joey    57      14:15   15:15   BRK_Lunch
        Joey    152     09:40   19:00   CONT_Shift

, который является "статусом" лиц по всем данным. Логика должна заключаться в том, что для каждого «периода» времени существует одна строка, поэтому она создает одну непрерывную «временную шкалу», основанную на ранге (ниже = более высокий приоритет), поэтому она выглядит следующим образом

Agent   Start   Stop    Code
Joey    09:40   11:30   CONT_Shift
Joey    11:30   11:45   BRK_Break1
Joey    11:45   14:15   CONT_Shift
Joey    14:15   15:15   BRK_Lunch
Joey    15:15   17:30   CONT_Shift
Joey    17:30   17:45   BRK_Break2
Joey    17:45   19:00   CONT_Shift

Есть идеи, как этого достичь? В идеале я хотел бы ограничить использование промежуточных таблиц и сделать это через CTE или, возможно, некоторые самостоятельные объединения, но не знаете, с чего начать?

1 Ответ

2 голосов
/ 21 июня 2011

Это действительно хороший вопрос, ответить на него было довольно сложно. сначала я ждал, пока кто-нибудь другой решит ее, но поскольку этого не произошло, я дал ей попытку, обнаружил ошибку и дал еще одну попытку.

это не красиво, но, похоже, в SQL нет функций, поддерживающих этот вопрос. Так что sql довольно сложный. Если кто-то придумает другое и лучшее решение, я буду первым, кто даст ему плюс.

declare @t table (name varchar(10), rank int, start datetime, stop datetime, code varchar(12))
insert @t values ('Joey', 52, '2011-06-21 11:30', '2011-06-21 11:45', 'BRK_Break1')     
insert @t values ('Joey', 53, '2011-06-21 17:30', '2011-06-21 17:45', 'BRK_Break2')         
insert @t values ('Joey', 57, '2011-06-21 14:15', '2011-06-21 15:15', 'BRK_Lunch')     
insert @t values ('Joey',152, '2011-06-21 09:40', '2011-06-21 19:00', 'CONT_Shift')
insert @t values ('Joey',152, '2011-06-22 09:40', '2011-06-22 19:00', 'CONT_Shift')

;with aa as
(
select name, rank, start, 'b' action, code from @t
union all
select name, rank, stop,  'e', code from @t
)
select * from (
select name,start, 
(select min(start) from aa where start > a.start and a.name = name) stop, 
(select code from (select rank() OVER (ORDER BY rank) as rank, code from @t where dateadd(second, 1, a.start) between start and stop and name = a.name) c where rank = 1) code
from aa a
where not exists (select 1 from @t where a.start between start and stop and a.rank > rank and a.name = name)
and exists (select 1 from @t where a.start between start and stop and a.name = name)
) d
where code is not null and 
name = 'Joey'
order by start 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...