gpt4 book ai didi

mysql - 为什么 Distinct * 不起作用但 count(Distinct *) 起作用?

转载 作者:行者123 更新时间:2023-12-01 01:39:58 31 4
gpt4 key购买 nike

有一张 table (在 HIVE)
示例 - meanalytics.key2_master_ids
该表有 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|
+--------+
2)hc.sql("Select count(distinct *) from meanalytics.key2_master_ids").show()

|count(DISTINCT cmpgn_id, offr_id, exec_id, creatv_id, cmpl_dt, mkt_cd)|
+----------------------------------------------------------------------+
| 589808|


从这两个查询我推断该表有重复的行。

现在我使用不同的 * 选择不同的行并查看计数
3)hc.sql("Select count(*) from (Select distinct * from meanalytics.key2_master_ids)").show()
+--------+
|count(1)|
+--------+
| 688919|
+--------+

如您所见,使用 distinct (688919) 后的计数与正常 count()(688919) 相同,但当我使用 count(distinct *)(589808) 时,结果不同。请有人解释一下结果吗?

编辑 1)
还尝试通过提供所有 6 个列名来明确选择所有不同的值,即使在那之后计数是 688919 而不是 589808,这是我在计算时得到的(distinct *)
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(*)COUNT(expr) 的处理方式不同在 SQL 中。来自 MySQL manual :

COUNT(*) is somewhat different in that it returns a count of the number of rows retrieved, whether or not they contain NULL values.



COUNT(DISTINCT expr)

Returns a count of the number of rows with different non-NULL expr values.



所以如果你有 NULL 的行值, COUNT(*)将返回所有行,正如 COUNT(*) FROM (SELECT DISTINCT * ...) (因为 SELECT DISTINCT * 将具有 NULL 值的行与具有非 NULL 值的行视为不同),但是 COUNT(DISTINCT expr)将只计算具有非 NULL 值的行,因此给出较低的结果。

hive manual表明它的行为方式相同。

看到这个 demo on dbfiddle使用带有 NULL 的某些行的表来查看此操作值。

请注意 COUNT(DISTINCT *)在任何版本的 MySQL 中都不是合法的语法(至少从 5.5 开始)。这可能是一个 hive 扩展。

关于mysql - 为什么 Distinct * 不起作用但 count(Distinct *) 起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59296050/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com