Eu experimentei um pouco e foi isso que eu fiz.
# Reading the data into a table
SELECT * INTO crosstab_test FROM
(VALUES (20180101,'001','Dog','Asthma','Mucus'),
(20180101,'001','Dog','Asthma','Noisy'),
(20180101,'001','Dog','Asthma','Respiratory'),
(20180102,'002','Cat','Osteoarthritis','Locomotor'),
(20180102,'002','Cat','Osteoarthritis','Limp'),
(20180131, '003', 'Bird', 'Avian Pox','Itchy')) as a (date, id, species, illness, tag);
SELECT DISTINCT date, id, species, illness, mucus, noisy, locomotor, respiratory, limp, itchy
FROM
(SELECT "date", id, species, illness
FROM crosstab_test) a
INNER JOIN
(SELECT * FROM crosstab(
'SELECT id, tag, ''TRUE'' FROM crosstab_test ORDER BY 1,2,3',
'SELECT DISTINCT tag FROM crosstab_test ORDER BY 1')
as tabelle (id text, Itchy text, Limp text, Locomotor text, Mucus text, Noisy text, Respiratory text)) b
USING(id)
ORDER BY 1;
date | id | species | illness | mucus | noisy | locomotor | respiratory | limp | itchy
----------+-----+---------+----------------+-------+-------+-----------+-------------+------+-------
20180101 | 001 | Dog | Asthma | TRUE | TRUE | | TRUE | |
20180102 | 002 | Cat | Osteoarthritis | | | TRUE | | TRUE |
20180131 | 003 | Bird | Avian Pox | | | | | | TRUE
(3 Zeilen)
Se você não se importa com a ordem das colunas, basta fazer
SELECT DISTINCT * ...
Substituindo o
NULL
s com FALSE
provavelmente será um pouco difícil, considerando as 350 tags que você diz ter. Então sugiro deixá-los de lado. Se você quiser, pode fazer SELECT DISTINCT date, id, species, illness, COALESCE(mucus, 'FALSE'), COALESCE(noisy, 'FALSE'),...
A pílula amarga que você terá que engolir é especificar todas as 350 tags como coluna com o tipo
text
em as the tabelle (id text, Itchy text, Limp text, Locomotor text, Mucus text, Noisy text, Respiratory text)
-parte da instrução crosstab. Certifique-se de colocá-los na ordem correta, conforme determinado por 'SELECT DISTINCT tag FROM crosstab_test ORDER BY 1'
também na instrução crosstab. Espero que seja isso que você estava procurando.