Как определить различные комбинации в столбцах массива, а затем распаковать в sql presto

У меня есть база данных, называемая программами, созданными как

    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, и мне действительно трудно получить желаемый результат. Ваша помощь будет очень признательна.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
3
0
19
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Требуемые данные не отображают «комбинации по столбцам раздела, подраздела и заголовка», кажется, что вам требуется сопоставить соответствующий массив на основе позиций, поэтому вы можете просто 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.АИССЛЕДОВАНИЕ

Другие вопросы по теме