为什么count(distinct ..)在同一个表上返回不同的值?

时间:2018-02-02 11:55:40

标签: mysql sql

select count(distinct a,b,c,d) from mytable;
select count(distinct concat(a,'-',b),concat(c,'-',d)) from mytable;

因为' - '永远不会出现在a,b,c,d字段中,上面的2个查询应返回相同的结果。我对吗 ?

实际情况并非如此,差异是~60M中的4行,我无法弄清楚这是怎么回事

任何想法或例子? 感谢

2 个答案:

答案 0 :(得分:1)

首先,我假设您使用的是MySQL,因为这是您原始标签中唯一可以接受语法的数据库。

其次,这并没有直接回答你的问题。鉴于你的类型和表达,我不知道你如何能得到不同的结果。但是,非常相似的结构会产生不同的结果。

非常重要的是要注意NULL不是罪魁祸首。如果NULLCOUNT(DISTINCT)的任何参数为CONCAT(),则结果为NULL - 并且NULL不计算在内。

但是,字符串末尾的空格可能是个问题。考虑此查询的结果:

select count(distinct x, y),
       count(distinct concat(x, '-', y)), 
       count(distinct concat(y, '-', x))
from (select 1 as x, 'a' as y union all
      select 1, 'a ' union all
      select 1, NULL
     ) a

我希望第二个和第三个参数返回同样的东西。但是字符串末尾的空格会导致差异。 COUNT(DISTINCT)忽略了它们。但是,CONCAT()会将它们嵌入字符串中。因此,上面的回报

1     1     2

这两个值是不同的。

换句话说,两个值可能不完全相同,但COUNT(DISTINCT)可能会将它们视为相同。空间就是一个例子。整理是另一个潜在的罪魁祸首。

答案 1 :(得分:0)

以示例数据为例

A   B   C   D
1   2   3   4
5   6   7   8
1   2   5   7
1   2   5   7
1   3   3   4
1   3   3   4

然后计数(distinct(a,b,c,d))= 4

A   B   C   D
1   2   3   4
5   6   7   8
1   2   5   7
1   3   3   4

和count(distinct(a, - ,b),distinct(c, - ,d))= 3

dist (a,-,b)        dist (c,-,d)    
1   2               3   4
5   6               7   8
1   3               5   7