SQL сгруппировать по двум столбцам, где порядок не имеет значения - PullRequest
0 голосов
/ 14 января 2020

Предположим, у меня есть эта таблица:

col1|col2|score
x   |y   |1
y   |x   |2
z   |w   |4
w   |z   |2

, и я хочу сгруппировать по col1 и col2 таким образом, чтобы не имело значения, является ли значение col1 или col2, поэтому x | y и y | x сгруппированы вместе. Агрегирующая функция может быть, например, AVG. Поэтому я хочу получить результат:

col1|col2|score
x   |y   |1.5
z   |w   |3

или

col1|col2|score
x   |y   |1.5
y   |x   |1.5
z   |w   |3
w   |z   |3

Я знаю, что могу группировать по двум столбцам, но это мне здесь не поможет, так как я могу это сделать который? (Я использую SQLite3, но я думаю, что ответ будет примерно одинаковым для любой SQL БД)

1 Ответ

2 голосов
/ 14 января 2020

Вы можете использовать агрегацию. Многие базы данных поддерживают least() и greatest(), что упрощает эту логику c до:

select least(col1, col2) as col1, greatest(col1, col2) as col2, avg(score) as score
from t
group by least(col1, col2), greatest(col1, col2)
order by least(col1, col2), greatest(col1, col2);

В базах данных, которые не поддерживают эти функции, вы можете использовать выражения case:

  • least(co1, col2) -> (case when col1 < col2 then col1 else col2 end)
  • greatest(co1, col2) -> (case when col1 < col2 then col2 else col1 end)

В SQLite вы можете использовать min() и max() с более чем одним аргументом в качестве эквивалента least() и greatest().

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