我有一个如下的映射表
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之类的内容时,查询没有正确的输出。
与众不同的结果仍然更少。
任何帮助将不胜感激。谢谢。
答案 0 :(得分:3)
我认为您可能会在处理一些组合而不是排列的内容,例如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
答案 1 :(得分:0)
从map_table中选择C1,C2,Count(*)按C1,C2分组按C1排序
答案 2 :(得分:0)
您可以使用函数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)
请参见demo。
结果:
| c1 | c2 | count_of_uniques |
| --- | --- | ---------------- |
| 1 | 1 | 2 |
| 1 | 2 | 2 |
| 1 | 3 | 3 |
| 2 | 2 | 1 |
| 2 | 3 | 1 |