SQL 查询中 COUNT DISTINCT 怎么用?

记得有一次我在一家小餐馆吃饭,点了炒饭和汤。
那天餐厅里有很多人,我注意到收银员正在划掉订单上的项目,好像在数什么。
过了一会儿,他突然停了下来,抬起头,对我笑了笑,说:“今天生意不错,点了二十多种菜。
”我很好奇,就问:“你是怎么算的?”他回答说:“用那个COUNT(DISTINCT)。
只要数一下每道菜的名字,你就知道了。
”当我听的时候,我意识到这个方法也可以用于数据库。
这使您可以快速查看有多少不同的订单项目和客户。
等等,还有一件事。
我记得有一次在对数据进行排序时使用过这个函数。
拿到结果后发现很多重复的数据被过滤掉了,非常有用。
但是,在某些情况下,NULL 值也可能被排除,因此使用时要小心。
如果您需要统计包含 NULL 的数据,您可能需要寻找另一种方法。

spark sql 的估算函数approx_count_distinct

那天在数据仓库,我面对一堆用户行为数据,想知道不同用户的数量。
一开始我直接使用countdistinct,但是让我等了很久。
数据量非常大,处理速度慢如蜗牛。
我突然想到SparkSQL中有approx_count_distinct。
它可以快得多并且错误是可以接受的。
试试吧,嘿嘿,速度快多了。
至于误差,我设置为0.05 ,看起来相当准确。
等等,我突然想到,如果数据集更大的话,误差可​​能更大,速度也更快,不是更节省资源吗?但如果误差很大的话,是不是也会对结果产生很大的影响呢?你必须仔细研究,看看如何平衡这个速度和准确性。

SQL中去重的三种方法

之前我对 SQL 重复数据删除一直很困惑。
我记得2 02 2 年,有一个城市,有海量的数据。
尝试处理任务表,但其中有许多重复的任务 ID。
当时我们用的是DISTINCT,但是效率很低,数据量巨大,处理起来就像蜗牛一样。
后来我发现这个方法适合简单的场景,但不适用于大数据量的情况。

然后我使用了GROUPBY。
这种方法更加灵活,可以与聚合函数一起使用。
但问题又发生了。
我同事用这个方法的时候,没有注意分组,犯了一个小错误。
直到后来我才意识到这种方法可能会导致某些数据库中未分组的列出现问题。

最后,我再次尝试了 ROW_NUMBER()。
这是一个窗口函数,相当复杂。
当我们添加 PARTITION BY 和 ORDER BY 时,我们得到了良好的重复数据删除结果。
然而,这种方法需要数据库支持窗口函数,而并非所有数据库都支持窗口函数。

嘿,当我们谈论这些差异时,让我给你举一个例子。
例如,我有一个测试表,其中用户 ID 和用户类型重复多次。
使用 DISTINCT 删除重复项。
只能从一列中删除重复项,而不能从多列中删除。
GROUPBY 重复数据删除可用于单列分组、多列分组或部分分组。
这是 MySQL 特定的语法。

综上所述,简单使用DISTINCT,进行分组统计使用GROUPBY,复杂逻辑使用ROW_NUMBER()窗口函数。
您使用哪一种取决于您的需求和数据库支持。
我也尝试过一步步调查。
现在想来,还蛮有趣的。