Сводная таблица с измененной структурой итоговой таблицы

#sql #postgresql

Вопрос:

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

 A           B           C           D
1720116452  1053384214  1205809217  1053384214
1053695668  1083893937  1518906734  1740293257
1053695668  1083893937  1518906734  1740293257
1053695668  1124136593  1518906734  1740293257
1053695668  1124136593  1518906734  1740293257
1053695668  1124136593  1518906734  1740293257
1053695668  1124136593  1518906734  1740293257
1124136593  1518906734  1740293253 1053695668
 

Как я могу написать запрос для получения этих выходных данных —

 A           B           
1720116452  1053384214  
1720116452  1205809217
1720116452  1053384214
1053695668  1083893937  
1053695668  1518906734  
1053695668  1740293257
1053695668  1124136593  
1124136593  1740293253
1124136593  1518906734
 

Выходная таблица-это таблица соединений между всеми столбцами входной таблицы. Например, если значение column A <> column B во входной таблице, затем вставьте запись в выходную таблицу. Если введено значение column A <> column C , затем вставьте другую запись. Причина, по которой строки 5, 6, 7 и 8 опущены из выходных данных, заключается в том, что эти соединения уже существуют в выходных данных.

Причина, по которой 1124136593 подключен только к 2 значениям, а не к 3, заключается в том, что 1053695668 уже подключен к нему в строке 7 вывода.

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

1. (1720116452, 1053384214) это вдвое больше вашего ожидаемого результата, почему? И почему (1124136593, 1053695668) пропал без вести?

2. Вы можете просто написать столько союзов, сколько вам нужно, с нужными вам столбцами

3. вы хотите вставить его в другую таблицу или просто хотите получить результат.

Ответ №1:

Я думаю, что вы описываете непривязанную операцию с удалением дубликатов в любом направлении:

 select distinct on (least(v.a, v.b), greatest(v.a, v.b)) v.a, v.b
from t cross join lateral
     (values (a, b), (a, c), (a, d)) v(a, b)
order by least(v.a, v.b), greatest(v.a, v.b);
 

Использование distinct on здесь предотвращает «обратные» дубликаты. Это также гарантирует, что результирующие значения будут a в первом столбце.

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

1. Как насчет (b, c), (b, d), (c, b) (c, d), (d, b) и т. Д.?

2. @Аарон . . . Вы, очевидно, можете включить их, если хотите. Однако в вопросе они не упоминаются.

3. Для чего наименьшее и наибольшее?

4. @Aaron . . . Чтобы предотвратить «обратные» дубликаты.