"Симметричный" GROUP BY на нескольких столбцах
У меня есть такая таблица:
_id sender_id receiver_id text
1 1 2 xxx
2 2 1 yyy
3 1 2 xyz
4 3 1 abc
Мне нужно сделать GROUP BY на обоих sender_id
а также receiver_id
столбцы, но он должен быть симметричным, поэтому {1,2} и {2,1} должны рассматриваться как одна и та же группа.
Этот запрос может быть выполнен на произвольной СУБД, поэтому он должен быть максимально стандартным.
1 ответ
Решение
Я думаю тебе нужно два CASE
выражения здесь, так как вы группируете по двум столбцам:
GROUP BY CASE WHEN sender_id < receiver_id THEN sender_id
ELSE receiver_id
END,
CASE WHEN sender_id < receiver_id THEN receiver_id
ELSE sender_id
END,
Если вы используете MySQL, рассмотрите возможность использования LEAST()
, GREATEST()
хитрость:
SELECT LEAST(sender_id, receiver_id), GREATEST(sender_id, receiver_id)
FROM yourTable
GROUP BY LEAST(sender_id, receiver_id), GREATEST(sender_id, receiver_id)
В SQLite вы можете использовать MAX()
а также MIN()
в качестве скалярных функций:
SELECT MIN(sender_id, receiver_id), MAX(sender_id, receiver_id)
FROM yourTable
GROUP BY MIN(sender_id, receiver_id), MAX(sender_id, receiver_id)