Dynami c перекрестное соединение на группу - PullRequest
0 голосов
/ 14 июля 2020

У меня есть следующая postgres таблица:

|---------------------|------------------|
|        Group        |      Product     |
|---------------------|------------------|
|          A          |         P1       |
|---------------------|------------------|
|          A          |         P2       |
|---------------------|------------------|
|          B          |         Q1       |
|---------------------|------------------|
|          B          |         Q2       |
|---------------------|------------------|
|          B          |         Q3       |
|---------------------|------------------|
|          C          |         R1       |
|---------------------|------------------|
|          C          |         R2       |
|---------------------|------------------|


Я хотел бы написать запрос, который выводит следующее:

|---------------------|
|        Array        |
|---------------------|
|      {P1,Q1,R1}     |
|---------------------|
|      {P1,Q2,R1}     |
|---------------------|
|      {P1,Q3,R1}     |
|---------------------|
|      {P1,Q1,R2}     |
|---------------------|
|      {P1,Q2,R2}     |
|---------------------|
|      {P1,Q3,R2}     |
|---------------------|
|      {P2,Q1,R1}     |
|---------------------|
|      {P2,Q2,R1}     |
|---------------------|
|      {P2,Q3,R1}     |
|---------------------|
|      {P2,Q1,R2}     |
|---------------------|
|      {P2,Q2,R2}     |
|---------------------|
|      {P2,Q3,R2}     |
|---------------------|

Это означает, что исходные данные должны быть в результате получится 12 (2x3x2) строк. Количество групп и продуктов в группе варьируется.

1 Ответ

1 голос
/ 14 июля 2020

Это делает это рекурсивно:

with recursive groupnums as (
  select distinct grp from gp
), numbering as (
  select grp, row_number() over (order by grp) gnum
    from groupnums
), numbered as (
  select n.gnum, gp.grp, gp.product
    from numbering n
    join gp on gp.grp = n.grp
), exploded as (
  select gnum, grp, product, array[product] as parray
    from numbered
   where gnum = 1
  union all
  select n.gnum, n.grp, n.product, e.parray||n.product
    from numbered n
    join exploded e on e.gnum = n.gnum - 1
)
select parray
  from exploded
 where gnum = (select max(gnum) from numbering)
 order by parray;

   parray   
------------
 {P1,Q1,R1}
 {P1,Q1,R2}
 {P1,Q2,R1}
 {P1,Q2,R2}
 {P1,Q3,R1}
 {P1,Q3,R2}
 {P2,Q1,R1}
 {P2,Q1,R2}
 {P2,Q2,R1}
 {P2,Q2,R2}
 {P2,Q3,R1}
 {P2,Q3,R2}
(12 rows)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...