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行,我无法弄清楚这是怎么回事
任何想法或例子? 感谢
答案 0 :(得分:1)
首先,我假设您使用的是MySQL,因为这是您原始标签中唯一可以接受语法的数据库。
其次,这并没有直接回答你的问题。鉴于你的类型和表达,我不知道你如何能得到不同的结果。但是,非常相似的结构会产生不同的结果。
非常重要的是要注意NULL
不是罪魁祸首。如果NULL
或COUNT(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