У меня есть база данных, называемая программами, созданными как
CREATE TABLE programs (
name varchar(200) NOT NULL,
role varchar(200) NOT NULL,
section text[] NOT NULL,
sub_section text[] NOT NULL,
title text[] NOT NULL
);
INSERT INTO programs (name, role, section, sub_section, title) VALUES
('John','Lead','{"VII","VII","VII"}','{"A","A","C"}','{"STUDY","STUDY","STUDY"}'),
('Olga','Member','{"VII","VII"}','{"A","A"}','{"STUDY","STUDY"}'),
('Ben','Co-Lead','{"XI","X"}','{"A","B"}','{"STUDY","TRAVEL"}'),
('Ana','Member','{"VII","II","VI"}','{"A","ALL","B"}','{"STUDY","STUDY","TRAVEL"}');
Вот как выглядит таблица
| name | role | section | sub_section | title |
| ---- | ------- | ------------ | ----------- | ------------------------ |
| John | Lead | VII,VII,VII | A,A,C | STUDY,STUDY,STUDY |
| Olga | Member | VII,VII | A,A | STUDY,STUDY |
| Ben | Co-Lead | XI,X | A,B | STUDY,TRAVEL |
| Ana | Member | VII,II,VI | A,ALL,B | STUDY,STUDY,TRAVEL |
Я хочу определить различные комбинации в столбцах раздела, подраздела и заголовка, а также развернуть их, чтобы получить это в качестве вывода.
| name | role | section.sub_section | title |
| ---- | ------- | ------------------- | ------------------------ |
| John | Lead | VII.A | STUDY
| John | Lead | VII.C | STUDY
| Olga | Member | VII.A | STUDY
| Ben | Co-Lead | XI.A | STUDY
| Ben | Co-Lead | X.B | TRAVEL
| Ana | Member | VII.A | STUDY
| Ana | Member | II.ALL | STUDY
| Ana | Member | VI.B | TRAVEL
Я новичок в SQL, и мне действительно трудно получить желаемый результат. Ваша помощь будет очень признательна.
Требуемые данные не отображают «комбинации по столбцам раздела, подраздела и заголовка», кажется, что вам требуется сопоставить соответствующий массив на основе позиций, поэтому вы можете просто unnest
и группировать по полям, которые вы хотите различать.
Предполагая, что соответствующие столбцы содержат массивы varchars (если нет, вам нужно будет использовать некоторые строковые функции для их преобразования):
-- sample data
WITH dataset (name, role, section, sub_section, title) AS (
VALUES ('John','Lead',array['VII','VII','VII'],array['A','A','C'],array['STUDY','STUDY','STUDY']),
('Olga','Member',array['VII','VII'],array['A','A'],array['STUDY','STUDY']),
('Ben','Co-Lead',array['XI','X'],array['A','B'],array['STUDY','TRAVEL']),
('Ana','Member',array['VII','II','VI'],array['A','ALL','B'],array['STUDY','STUDY','TRAVEL'])
)
--query
select name,
role,
sec || '.' || sub_sec "section.sub_section",
t title
from dataset
cross join unnest(section, sub_section, title) as t(sec, sub_sec, t)
group by name, role, sec, sub_sec, t
order by name
Выход:
название | роль | section.sub_section | заглавие |
---|---|---|---|
Ана | Член | VII.А | ИССЛЕДОВАНИЕ |
Ана | Член | II.ВСЕ | ИССЛЕДОВАНИЕ |
Ана | Член | VI.Б | ПУТЕШЕСТВОВАТЬ |
Бен | Соруководитель | XI.А | ИССЛЕДОВАНИЕ |
Бен | Соруководитель | Х.Б | ПУТЕШЕСТВОВАТЬ |
Джон | Вести | VII.А | ИССЛЕДОВАНИЕ |
Джон | Вести | VII.С | ИССЛЕДОВАНИЕ |
Ольга | Член | VII.А | ИССЛЕДОВАНИЕ |