#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. Простое декартово произведение не решит мой случай, любые другие идеи приветствуются, спасибо!!