Создание комбинаций данных в sql

#sql #sql-server #window-functions #cross-join #hana-sql-script

#sql #sql-сервер #окно-функции #перекрестное объединение #hana-sql-скрипт

Вопрос:

У меня есть таблица, подобная приведенной ниже —

COL1 COL2
101 A
102 B
102 C
102 D
103 C
103 E

Мне нужно сгенерировать все возможные комбинации вместе с UniqueID для набора уникальных значений в COL1, показанных ниже — в COL1 есть 3 уникальных значения, возможны 6 комбинаций, и поэтому в результате должно быть 18 строк.

 1,101,A
1,102,B
1,103,C
2,101,A
2,102,B
2,103,E
3,101,A
3,102,C
3,103,C
4,101,A
4,102,C
4,103,E
5,101,A
5,102,D
5,103,C
6,101,A
6,102,D
6,103,E
 

Пожалуйста, помогите и предложите ответ. Я пытался использовать LAG , LEAD , CROSS JOIN , не удалось найти решение.

Ответ может быть с использованием любого из сценариев HANA SQL или Oracle SQL или MS-SQL. У меня есть решение, которое работает для фиксированного количества уникальных значений в COL1, однако мне нужно, чтобы решение было динамическим и работало с любым количеством комбинаций и значений.

Комментарии:

1. «Я пытался использовать LAG , LEAD , CROSS JOIN , не удалось найти решение». И что это были за попытки? Почему они не сработали?

2. Как генерируются эти комбинации ? 1,101,A 1,102,B 1,103,C

3. @VenkataramanR — Мне нужен код SQL для генерации этих комбинаций. Это та помощь, о которой я прошу.

4. я сомневаюсь, почему рассматривается только 102, B, а не 102, C или 102, D?

5. @VenkataramanR — они рассматриваются. Посмотрите последние две комбинации. ABC, ABE, ACC, ACE, ADC, ADE

Ответ №1:

Это отвечает на исходную версию вопроса.

Если я правильно понимаю, я думаю, что самый простой метод — поместить значения в одну строку:

 select row_number() over (order by t1.col1, t2.col1, t3.col1),
       t1.col1, t1.col2,
       t2.col1, t2.col2,
       t3.col1, t3.col2
from t t1 join
     t t2
     on t1.col1 < t2.col1 join
     t t3
     on t2.col1 < t3.col1;
 

Вы можете отменить эти результаты, если хотите.

Комментарии:

1. Небольшое изменение сработало. выберите row_number() поверх (порядок по t1.col1, t2.col1, t3.col1), t1.col1, t1.col2, t2.col1, t2.col2, t3.col1, t3.col2 из t t1 присоединиться к t t2 на t1.col1 < t2.col1 присоединиться к tt3 на t2.col1 < t3.col1; И да, мне нужно свести эти результаты. Спасибо за помощь.

2. Поскольку есть только 3 cols, я могу поворачиваться, используя UNION ALL. Спасибо, Гордон.

3. Приведенный выше код помогает, если у меня есть только 3 уникальных значения в COL1, однако мне нужно, чтобы решение было динамичным и работало с любым количеством комбинаций и значений

4. @Gowthi . . . Это отвечает на вопрос, который вы задали здесь. Если у вас есть другой вопрос, задайте его как новый вопрос.

5. Я обновил свой вопрос @gordon linoff, не могли бы вы ответить сейчас. Пожалуйста, помогите, спасибо!!

Ответ №2:

Вы можете выполнить декартово произведение между различными значениями строк

 select *
    from (select distinct COL1
          from yourTable) as t1,
         (select distinct COL2
          from yourTable) as t2
 

Комментарии:

1. Нет, так работать не будет. Количество комбинаций зависит от различных значений в COL1 и значений, присутствующих в COL2 для каждого значения в COL1. Простое декартово произведение не решит мой случай, любые другие идеи приветствуются, спасибо!!