2013-12-17 2 views
1

EDIT: Очень необходимо уточнить, что имя может иметь много пар неперекрывающихся запусков и концов. Таким образом, объединенные пары могут быть идентифицированы как «Run».Объединение пар строк с одним столбцом DateTime в отдельные строки с столбцами даты начала и окончания

Я предполагаю, что это дублированный вопрос, но я не могу найти другого. Если кто-то может указать мне на это, то это может быть закрыто или удалено или что угодно.

У меня есть таблица, которая выглядит следующим образом:


Id Name  Action  ActionDate 
---- ------- ------  ---------- 
1 John  Start  01/15/2013 
2 Mary  Start  01/17/2013 
3 Nancy  Start  01/17/2013 
4 John  End   01/18/2013 
5 Mary  End   01/18/2013 
6 Nancy  End   01/20/2013 
7 John  Start  01/19/2013 
8 Mary  Start  01/20/2013 
9 Nancy  Start  01/25/2013 
10 John  End   01/21/2013 
11 Mary  End   01/22/2013 
12 Nancy  End   01/30/2013 

И мне нужен результирующий набор, который выглядит, как это с помощью запроса на основе набора:


Id Name Run StartActionDate EndActionDate 
---- ------- ---- --------------- ------------- 
1 John 1  01/15/2013   01/18/2013 
2 John 2  01/19/2013   01/21/2013 
3 Mary 1  01/17/2013   01/18/2013 
4 Mary 2  01/20/2013   01/22/2013 
5 Nancy 1  01/17/2013   01/20/2013 
6 Nancy 2  01/25/2013   01/30/2013 
+0

Будут ли у ваших имен несколько пар действий/даты? – Taryn

+0

Является ли 'Имя' уникальным? Если нет, результаты не будут надежными. – Mike

+0

Да, имя будет иметь много пар начала и конца. И да, в результирующем наборе имя будет уникальным. –

ответ

0

Проверить это

select MIN(Id),Name,MIN(case Action when 'Start' then ActionDate End) as StartActionDate,MIN(case Action When 'End' then ActionDate End) as EndActiondate from dbo.Table group by Name 
+0

Спасибо Анджали, я уточню вопрос, но есть не только дата начала и конца имени. Имя начинается и заканчивается много раз. –

0

Предполагая, что есть только 1 запись с «Пуск» и 1 запись с «Конец» для каждого имени, что-то вроде этого должно быть wo гк:

SELECT T1.Id, T1.Name, T1.ActionDate AS [StartActionDate], T2.ActionDate AS [EndActionDate] 
FROM MyTable T1 
INNER JOIN MyTable T2 ON T1.Name = T2.Name 
WHERE T1.Action = 'Start' AND T2.Action = 'End' 
+0

Спасибо, Dan, я уточню вопрос, но есть не только дата начала и конца имени. Имя начинается и заканчивается много раз. –

+0

Итак, вы хотите вывести минимальную начальную дату и максимальный конец, или вам нужно вывести каждую соседнюю пару стартовых дат и окончаний? В последнем случае, какие потенциально перекрывающиеся периоды? – Dan

+0

Смежные пары, не перекрывающиеся. –

0

Хотя это не очень понятно, что id вы хотите, чтобы вернуться, если у вас есть несколько пар каждого name, вы должны быть в состоянии использовать оконную функцию как row_number() генерировать уникальную последовательность для каждого имени с действием а затем произвести окончательный результат:

;with cte as 
(
    select id, name, action, actiondate, 
    row_number() over(partition by name, action 
         order by actiondate) seq 
    from yourtable 
) 
select 
    min(id) id, 
    name, 
    max(case when action = 'start' then actiondate end) StartActionDate, 
    max(case when action = 'end' then actiondate end) EndActionDate 
from cte 
group by name, seq 
order by id; 

См SQL Fiddle with Demo

на основе ваших данных изменений, вы должны быть в состоянии использовать что-то подобное:

;with cte as 
(
    select id, name, action, actiondate, 
    row_number() over(partition by name, action 
         order by actiondate) seq 
    from yourtable 
) 
select 
    row_number() over(order by name) id, 
    name, 
    seq run, 
    max(case when action = 'start' then actiondate end) StartActionDate, 
    max(case when action = 'end' then actiondate end) EndActionDate 
from cte 
group by name, seq 
order by id 

См. SQL Fiddle with Demo. Это дает результат:

| ID | NAME | RUN |    STARTACTIONDATE |     ENDACTIONDATE | 
|----|-------|-----|--------------------------------|--------------------------------| 
| 1 | John | 1 | January, 15 2013 00:00:00+0000 | January, 18 2013 00:00:00+0000 | 
| 2 | John | 2 | January, 19 2013 00:00:00+0000 | January, 21 2013 00:00:00+0000 | 
| 3 | Mary | 1 | January, 17 2013 00:00:00+0000 | January, 18 2013 00:00:00+0000 | 
| 4 | Mary | 2 | January, 20 2013 00:00:00+0000 | January, 22 2013 00:00:00+0000 | 
| 5 | Nancy | 1 | January, 17 2013 00:00:00+0000 | January, 20 2013 00:00:00+0000 | 
| 6 | Nancy | 2 | January, 25 2013 00:00:00+0000 | January, 30 2013 00:00:00+0000 | 
Смежные вопросы