Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 为什么Distinct*不工作,但count(Distinct*)工作?_Mysql_Sql_Hive_Hiveql - Fatal编程技术网

Mysql 为什么Distinct*不工作,但count(Distinct*)工作?

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| +--------+ 从这两个查询中,我推

蜂房里有一张桌子 示例-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|
+--------+
从这两个查询中,我推断该表有重复的行

现在我使用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|
+--------+