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

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

col1|col2|col3|score
x   |y   |a   |1
y   |x   |b   |2
z   |w   |c   |4
w   |z   |d   |2

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

col1|col2|col3|score
x   |y   |a   |1.5
y   |x   |b   |1.5
z   |w   |c   |3
w   |z   |d   |3

Я смог сделать это так:

create table t2 as select min(col1,col2) as col1, max(col1,col2) as col2 , avg(score) as score from t1 group by min(col1, col2), max(col1, col2);
select * from t1 inner join t2 on (t1.col1 = t2.col1 and t1.col2 = t2.col2) or (t1.col1 = t2.col2 and t1.col2 = t2.col1);

но:
а. Я не уверен, что это правильно и
б. Для работы с реальными данными (таблица с 300 тыс. Строк) используется SQLite.
Существует ли более простой / быстрый способ сделать это?

Спасибо!

Ответы [ 2 ]

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

Попробуйте AVG() оконную функцию:

select col1, col2, col3,
  avg(score) over (partition by min(col1, col2), max(col1, col2)) score
from t1 
order by col3 

См. Демоверсию . Результаты:

| col1 | col2 | col3 | score |
| ---- | ---- | ---- | ----- |
| x    | y    | a    | 1.5   |
| y    | x    | b    | 1.5   |
| z    | w    | c    | 3     |
| w    | z    | d    | 3     |
1 голос
/ 14 января 2020

Используйте трюк MIN / MAX:

SELECT
    t1.col1,
    t1.col2,
    t1.col3,
    t2.score
FROM yourTable t1
INNER JOIN
(
    SELECT MIN(col1, col2) AS col1, MAX(col1, col2) AS col2, AVG(score) AS score
    FROM yourTable
    GROUP BY MIN(col1, col2) AS col1, MAX(col1, col2)
) t2
    ON MIN(t1.col1, t1.col2) = t2.col1 AND
       MAX(t1.col1, t1.col2) = t2.col2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...