Интересно, как поместить несколько значений массива в имена столбцов со значениями TRUE / FALSE.Я приведу вам конкретный пример:
У меня есть повторяющиеся строки с дублированием последнего столбца из-за разных результатов:
DATE ID Species Illness Tag
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
Я хочу получить следующее:
DATE ID Species Illness Mucus Noisy ... Limp Itchy
20180101 001 Dog Asthma TRUE TRUE ... FALSE FALSE
20180102 002 Cat Osteoarth. FALSE FALSE ... TRUE FALSE
...
20180131 003 Bird Avian Pox FALSE FALSE ... FALSE TRUE
Я пытался использовать функцию "кросс-таблица" только для части тегов, но она выдает ошибку несуществующей функции:
select *
from crosstab (
'select c.id, tg."name"
FROM taggings t
join consultations c
on c.id=t.taggable_id
join tags tg
on t.tag_id=tg.id
group by c.id, tg."name"'
) as final_result(dermatological BOOLEAN, behaviour BOOLEAN)
Кстати.У меня около 350 тегов, так что это не самая оптимальная функция: /
РЕДАКТИРОВАТЬ: Наконец, я добавил расширение tablefunc, и я попытался с crosstab (), но я получил следующую ошибку:
Сбой выполнения запроса Причина: ошибка SQL [22023]: ОШИБКА: недопустимый оператор SQL данных источника. Подробно: предоставленный SQL должен возвращать 3 столбца: rowid, category и values.
попробуйте найти решение и обновить его здесь, но если кто-то знает, как его решить, пожалуйста, поделитесь :) Спасибо!
После нескольких дней чтения и пробования предлагаемых решений, это сработало для меня:
Я получил 3 отдельные таблицы, а затем соединил первую и третью, чтобы получить необходимую мне информацию, плюс теги в виде столбцов со значением 1/0, если тег существует в определенномЯ БЫ.Еще одно правление => Мне на самом деле не нужна дата, поэтому я основал таблицы на идентификаторах консультаций.
ТАБЛИЦА 1: Получите таблицу всех столбцов, сгруппированных поИдентификаторы и получите все теги, которые есть у одного идентификатора.
ID Species Age Illness Tag
001 Dog 2 Asthma Mucus
001 Dog 2 Asthma Noisy
001 Dog 2 Asthma Respiratory
002 Cat 5 Osteoarthritis Locomotor
002 Cat 5 Osteoarthritis Limp
...
003 Bird 1 Avian Pox Itchy
ТАБЛИЦА 2: Получите декартово произведение, которое будет пересекать все консультации со списком всех различных тегов, и закажите ихдля функции crosstab ().(функция кросс-таблицы должна иметь 3 столбца; ID, теги и значения)
With consultation_tags as
(here put the query of the TABLE 1),
tag_list as
(select tags."name"
from tags
join taggings t on t.tag_id = tags.id
join consultations c on c.id = t.taggable_id a
group by 1), —-> gets the list of all possible tags in the DB
cartesian_consultations_tags as
(select consultations_tags.id, tag_list.name,
case when tag_list.name = consultations_tags.tag_name then 1
else 0 --> "case" gets the value 1/0 if the tag is present in an ID
end as tag_exists
from
consultations_tags
cross join
tag_list)
select cartesian_consul_tags.id, cartesian_consul_tags.name,
SUM(cartesian_consul_tags.tag_exists) --> for me, the values were duplicated, and so were tags
from cartesian_consul_tags
group by 1, 2
order by 1, 2
-> порядок тегов здесь действительно важен, потому что именно вы называете столбцы в функции кросс-таблицы;он не преобразует определенный тег в столбец, он только передает значение этой позиции тега, поэтому, если вы запутаете порядок именования, значения не будут соответствовать правильно.
ТАБЛИЦА 3: Кросс-таблица второй таблицы -> она поворачивает декартову таблицу произведений, или в этом случае ТАБЛИЦУ 2.
SELECT *
FROM crosstab(‘ COPY THE TABLE 2 ‘) --> if you have some conditions like “where species = ‘Dogs’”, you will need to put double apostrophe in the string value —> where species = ‘’Dogs’’
AS ct(id int4,”Itchy” int8,
“Limp” int8,
“Locomotor” int8,
“Mucus” int8,
“Noisy” int8) --> your tag list. You can prepare it in excel, so all the tags are in quotation marks and has corresponding datatype. The datatype of the tags has to be the same as the datatype of the “value” in the table 2
НАКОНЕЦ , финальная таблица, которую я хотел, была присоединиться к таблицам1 и 3, поэтому мне нужна информация из идентификаторов консультаций и список тегов в виде столбцов со значениями 0/1, если тег присутствует в определенной консультации.
with table1 as ( Copy the query of table1),
table3 as ( Copy the query of table3)
select *
from table1
join table3 on
table1.id=table3.id
order by 1
И финальная таблицавыглядит так:
ID Species Illness Mucus Noisy ... Limp Itchy
001 Dog Asthma 1 1 ... 0 0
002 Cat Osteoarth. 0 0 ... 1 0
...
003 Bird Avian Pox 0 0 ... 0 1