В качестве альтернативы провер МТО в тренер, вы могли бы UNPIVOT данных из таблицы:
select *
from your_table
unpivot (product for pos in (product1 as 1, product2 as 2, product3 as 3,
product4 as 4, product5 as 5));
KEY CL EMAILADDRESS CT POS PRODUCT
---------- -- ------------- --- ---------- ----------
1 X [email protected] A 1 12
2 X [email protected] B 1 123
2 X [email protected] B 2 22
использовать, чтобы подобрать ключ и генерировать значение CT (бесстыдно зажимая регулярное выражение МТА для удаления дубликатов), и генерация нового значения позиции:
with t as (
select *
from your_table
unpivot (product for pos in (product1 as 1, product2 as 2, product3 as 3,
product4 as 4, product5 as 5))
)
select min(key) over (partition by cl, emailaddress) as key,
cl,
emailaddress,
regexp_replace(
listagg(ct, '+') within group (order by key) over (partition by cl, emailaddress),
'(.)(\+\1)+', '\1') as ct,
rank() over (partition by cl, emailaddress order by key, pos) as pos,
product
from t;
KEY CL EMAILADDRESS CT POS PRODUCT
---------- -- ------------- --- ---------- ----------
1 X [email protected] A+B 1 12
1 X [email protected] A+B 2 123
1 X [email protected] A+B 3 22
И, наконец, повернуть его обратно:
with t as (
select *
from your_table
unpivot (product for pos in (product1 as 1, product2 as 2, product3 as 3,
product4 as 4, product5 as 5))
)
select key, cl, emailaddress, ct, a_product as product1, b_product as product2,
c_product as product3, d_product as product4, e_product as product5
from (
select min(key) over (partition by cl, emailaddress) as key,
cl,
emailaddress,
regexp_replace(
listagg(ct, '+') within group (order by key) over (partition by cl, emailaddress),
'(.)(\+\1)+', '\1') as ct,
rank() over (partition by cl, emailaddress order by key, pos) as pos,
product
from t
)
pivot (max(product) as product for (pos) in (1 as a, 2 as b, 3 as c, 4 as d, 5 as e));
KEY CL EMAILADDRESS CT PRODUCT1 PRODUCT2 PRODUCT3 PRODUCT4 PRODUCT5
---------- -- ------------- --- ---------- ---------- ---------- ---------- ----------
1 X [email protected] A+B 12 123 22
Это немного сложнее, сделанное делая имена столбцов в конечном итоге соответствовать вашей исходной таблице. Я также предположил, что вы хотите сохранить наименьшее значение ключа, свяжите значения CT в ключевом порядке и сохраните продукты в том же порядке, в каком они появились изначально - или, по крайней мере, с продуктами первого ключа в первоначальном порядке, следуют продукты из второго ключа в их первоначального заказа и т.д.
выход не имеет никакого смысла. Я не вижу в этом никакой логики. –
Логика вашего нужного результата не ясна. Пожалуйста, объясните, какова должна быть идея такого результата; для чего вы groupin? mail и CL? Key = 1, потому что это минимальное значение? почему product1 = 12, product2 = 123 и product3 = 22? – Aleksej