Рассмотрим следующую таблицу и строки:
Листинг 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 и Марка Баннистера выполняют то, что я хотел.Я наконец выбрал второй, так как он кажется мне более понятным.Спасибо всем за ответы!