Mysql 为什么Distinct*不工作,但count(Distinct*)工作?
蜂房里有一张桌子 示例-meanalytics.key2\u主\u ID 此表有6列Cmpgn_id、offr_id、exec_id、creatv_id、cmpl_dt、mkt_cd,并且可能有重复的行 下面是我运行的以下查询Mysql 为什么Distinct*不工作,但count(Distinct*)工作?,mysql,sql,hive,hiveql,Mysql,Sql,Hive,Hiveql,蜂房里有一张桌子 示例-meanalytics.key2\u主\u ID 此表有6列Cmpgn_id、offr_id、exec_id、creatv_id、cmpl_dt、mkt_cd,并且可能有重复的行 下面是我运行的以下查询 1)hc.sql("Select count(*) from meanalytics.key2_master_ids").show() - +--------+ |count(1)| +--------+ | 688919| +--------+ 从这两个查询中,我推
1)hc.sql("Select count(*) from meanalytics.key2_master_ids").show()
- +--------+
|count(1)|
+--------+
| 688919|
+--------+
从这两个查询中,我推断该表有重复的行
现在我使用distinct*选择distinct行并查看计数
3)hc.sql("Select count(*) from (Select distinct * from meanalytics.key2_master_ids)").show()
+--------+
|count(1)|
+--------+
| 688919|
+--------+
您可以看到,使用distinct 688919后的计数与正常计数688919相同,但当我使用countdistinct*589808时则不同。请解释一下结果好吗
编辑1
还尝试通过提供所有6个列名来显式选择所有不同的值,即使在这之后,计数是688919,而不是我执行countdistinct时得到的589808*
hc.sql("Select count(*) from (Select distinct cmpgn_id,offr_id,exec_id,creatv_id,cmpl_dt,mkt_cd from meanalytics.key2_master_ids)").show()
+--------+
|count(1)|
+--------+
| 688919|
+--------+
原因是COUNT*与SQL中的COUNTexpr的处理方式不同。从: COUNT*有些不同,它返回 检索的行数,无论它们是否包含空值 而COUNTDISTINCT expr 返回具有不同非空expr值的行数的计数 因此,如果您有空值的行,COUNT*将返回所有行,就像selectdistinct*中的COUNT*一样。。。由于SELECT DISTINCT*将具有空值的行与具有非空值的行视为不同,但COUNTDISTINCT expr将仅计算具有非空值的行,因此给出的结果较低 这表明它的行为方式相同 请参阅此项,以查看对具有空值的某些行的表的操作
请注意,至少从5.5版开始,COUNTDISTINCT*在任何MySQL版本中都不是合法语法。这可能是一个hive扩展。@KenWhite这就是他们使用COUNT DISTINCT*顺便说一句,在sqlfiddle上不可复制的做法:是的,我明白了,你的问题其实不是关于mysql的。@zerkms:是的,我猜这将是mysql中的一个从背后咬我的东西。真希望他们能做些有意义的事哦,等等,更糟。它甚至不是MySQL。@KenWhite事实上,我甚至回答说它不是一个有效的语法,只是为了查看文档并发现我也错了:耸耸肩:谢谢你的回答,在这种情况下,我如何从这个表中创建没有任何空行的其他表?@JayBhanushali你可以尝试插入。。。将查询选择到一个新表中,其中的WHERE条件排除了任何具有空列值的行,即cmpgn_id不为空,offr_id不为空,并且…COUNT*在mysql中不是特例:它是一种标准的ANSI SQL语法,mysql只是将其实现为-is@zerkms我指的是MySQL对待COUNT*的方式与COUNTexpr;但你是对的,措辞令人困惑,因为这是标准行为。我编辑过。如果你认为措辞可以进一步改进,我很高兴你能修改。
hc.sql("Select count(*) from (Select distinct cmpgn_id,offr_id,exec_id,creatv_id,cmpl_dt,mkt_cd from meanalytics.key2_master_ids)").show()
+--------+
|count(1)|
+--------+
| 688919|
+--------+