SQL-запрос, чтобы получить количество уникальных комбинаций в таблице - MySql - PullRequest
0 голосов
/ 28 мая 2019

У меня есть таблица сопоставления, как показано ниже

c1  c2
--  --
1   1
1   1
1   2
1   3
1   3
2   1
2   2
2   3
3   1

и так далее. Таблица имеет отдельный столбец идентификатора (здесь не показан). Вот мой запрос:

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, запрос не имеет правильного вывода.

отчетливо показывает еще меньше результатов.

Любая помощь очень ценится. Спасибо.

Ответы [ 3 ]

3 голосов
/ 28 мая 2019

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

Пример с DB Fiddle

1 голос
/ 28 мая 2019

Вы можете использовать функции 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                |
0 голосов
/ 28 мая 2019

Выберите C1, C2, Count (*) из map_table. Группировать по C1, C2. Порядок по C1

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