Конвертировать строки в столбцы, допускающие дубликаты - PullRequest
1 голос
/ 01 сентября 2010

Рассмотрим следующую таблицу и строки:

Листинг A.

ID, name, event, type
1, 'John Doe', '2010-09-01 15:00:00.000', 'input'
1, 'John Doe', '2010-09-03 11:00:00.000', 'input'
1, 'John Doe', '2010-09-04 17:00:00.000', 'input'
1, 'John Doe', '2010-09-02 15:00:00.000', 'output'
1, 'John Doe', '2010-09-03 16:00:00.000', 'output'
1, 'John Doe', '2010-09-06 17:00:00.000', 'output'

Мне нужно преобразовать строки в столбцы, чтобы у меня было два разных столбца: входное событие и выходнойсобытие.Как:

Листинг B.

ID, name, input event, output event
1, 'John Doe', '2010-09-01 15:00:00.000', '2010-09-02 15:00:00.000'
1, 'John Doe', '2010-09-03 11:00:00.000', '2010-09-03 16:00:00.000'
1, 'John Doe', '2010-09-04 17:00:00.000', '2010-09-06 17:00:00.000'

Мне удалось получить что-то вроде следующего:

Листинг C.

ID, name, input event, output event
1, 'John Doe', '2010-09-01 15:00:00.000', null
1, 'John Doe', '2010-09-03 11:00:00.000', null
1, 'John Doe', '2010-09-04 17:00:00.000', null
1, 'John Doe', null, '2010-09-02 15:00:00.000'
1, 'John Doe', null, '2010-09-03 16:00:00.000'
1, 'John Doe', null, '2010-09-06 17:00:00.000'

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

select ID, name, max(case when type = 'input' then event else null end) as 'input event', max(case when type = 'output' then event else null end) as 'output event' from events group by ID, name

, но, конечно, GROUP BY собирается исключить дубликаты, а это то, чего я не хочу.

Есть идеи, как этого добиться с помощью запроса?

Было бы неплохо иметь переносимое решение для sql или для postgresql, но любая идея очень ценится.ответ.Оба решения от AlexRednic и Марка Баннистера выполняют то, что я хотел.Я наконец выбрал второй, так как он кажется мне более понятным.Спасибо всем за ответы!

Ответы [ 3 ]

2 голосов
/ 02 сентября 2010

Попробуйте следующее:

select ID, name, event as 'input event', 
       (select min(o.event) 
        from events o 
        where o.type = 'output' and 
              i.ID = o.ID and 
              i.name = o.name and 
              i.event < o.event) as 'output event' 
from events i
where i.type = 'input'
group by ID, name, event
1 голос
/ 01 сентября 2010
select t1.id,t1.name,t1.event,t2.event from test t1
    inner join test t2 on t1.event <= t2.event 
        and t1.type = 'input' 
        and t2.type = 'output'
                   and t1.id = t2.id
                   and t1.name = t2.name

Дело в том, что вам нужно как-то связать сеансы ввода / вывода.В этом запросе я сделал это с помощью столбца события timestamp.Не могли бы вы предоставить больше информации, если это не то, что вы хотели?

Обновление: сейчас, чтобы немного постобработать, вы могли бы сделать

with a as
(
select t1.id,t1.name,t1.event as in_event,t2.event as out_event from test t1
    inner join test t2 on t1.event <= t2.event 
                   and t1.type = 'input' 
                   and t2.type = 'output'
                   and t1.id = t2.id
                   and t1.name = t2.name
)
select id,name,in_event,min(out_event)
       from a
group by id,name,in_event
0 голосов
/ 01 сентября 2010

Пишу с самого начала:

create table #a(
ID int,
name varchar(30),
event datetime,
type varchar(10)
)

insert #a
select  
1, 'John Doe', '2010-09-01 15:00:00.000', 'input'
union select 1, 'John Doe', '2010-09-01 16:00:00.000', 'input'
union select 1, 'John Doe', '2010-09-01 17:00:00.000', 'input'
union select 1, 'John Doe', '2010-09-02 15:00:00.000', 'output'
union select 1, 'John Doe', '2010-09-02 16:00:00.000', 'output'
union select 1, 'John Doe', '2010-09-02 17:00:00.000', 'output'

- вот решение sql

select 
    ID, 
    name, 
    case when type = 'input' then event else null end "input event",
    case when type = 'output' then event else null end "output event"
 from #a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...