У меня есть таблица сопоставления, как показано ниже
c1 c2
-- --
1 1
1 1
1 2
1 3
1 3
2 1
2 2
2 3
3 1
и так далее. В таблице есть отдельный столбец id (здесь не показан). Вот мой запрос до сих пор:
SELECT `c1`, `c2`, COUNT(*) AS `count_of_uniques` FROM `map_table`
GROUP BY `c1`, `c2`
Я также пробовал с отдельным запросом, подобным этому.
SELECT `c1`, `c2`, COUNT(DISTINCT `c1`, `c2`) AS `count_of_uniques` FROM `map_table`
Ожидаемый результат
c1 c2 count_of_uniques
-- -- ----------------
1 1 2
1 2 2
1 3 3
2 2 1
2 3 1
Мой текущий запрос показывает правильный вывод, когда комбинация состоит из двух одинаковых чисел, но когда у нас есть что-то вроде 1-2 и 2-1, запрос не дает правильного вывода.
отчетливо показывает еще меньше результатов.
Любая помощь приветствуется. Спасибо.
это SQL или MySQL?
@raymond-nijland Тогда я исправляюсь
@GarethD Прошу прощения за неправильные данные. Я пытался сделать вещи простыми, но терял много деталей. Вот собственно проблема
Выберите C1,C2,Count(*) из map_table Group By C1,C2 Order by C1
I думать вам может понадобиться что-то, что касается комбинаций, а не перестановок, то есть 1, 2
и 2, 1
следует рассматривать как одну и ту же комбинацию. Если это так, вы можете использовать выражение case, чтобы убедиться, что c1 всегда является меньшим из двух значений, а c2 — большим из двух. Это сгруппирует похожие пары вместе (так что 2, 1
сначала будет перевернуто, чтобы стать 1, 2
, а затем сгруппировано со всеми похожими результатами):
SELECT c1, c2, COUNT(*) AS `count_of_uniques`
FROM ( SELECT CASE WHEN c1 > c2 THEN c2 ELSE c1 END AS c1,
CASE WHEN c1 > c2 THEN c1 ELSE c2 END AS c2
FROM map_table) AS t
GROUP BY c1, c2
Выход
c1 c2 count_of_uniques
-------------------------------
1 1 2
1 2 2
1 3 3
2 2 1
2 3 1
Лучший ответ, я думаю. Однако вопрос: что было бы более эффективным между использованием функции IF
и использованием оператора CASE
?
В вопросе показан случай выражение, а не оператор case (разница часто заключается в том, что я педантичен, но в MySQL это более важно, поскольку MySQL имеет как выписка по делу, так и падежное выражение). Тем не менее, это уже спрашивали так и не было исчерпывающего ответа. На самом деле я ожидаю, что любая разница в производительности будет настолько незначительной, что их можно будет считать равными.
Я знаю SQL Server намного лучше, чем MySQL, и я знаю, что SQL Server, эквивалентный IF()
(IIF()
), в любом случае переписывается во время компиляции как выражение CASE, поэтому разница в производительности абсолютно нулевая. Я ожидаю, что MySQL будет опережать аналогичную операцию, так что внутренне обе выполняют точно такую же операцию.
Вы можете использовать функции least()
и greatest()
, чтобы получить пары, по которым вы будете группироваться:
select
least(c1, c2) c1,
greatest(c1, c2) c2,
count(*) count_of_uniques
from map_table
group by
least(c1, c2),
greatest(c1, c2)
Смотрите демо.
Результаты:
| c1 | c2 | count_of_uniques |
| --- | --- | ---------------- |
| 1 | 1 | 2 |
| 1 | 2 | 2 |
| 1 | 3 | 3 |
| 2 | 2 | 1 |
| 2 | 3 | 1 |
Ваш ожидаемый результат точно соответствует фактический результат вашего первого запроса. Вы разместили неправильный ожидаемый результат?