distinct的四种用法

Distinct...是去重的...很方便...
在数据库中使用...比如2 02 2 年...我在上海的一家公司...我在做数据报表...对于user表的用户...我想统计有多少个唯一的用户名...就用 SELECT DISTINCT username FROM users...这个东西...取决于username字段是否有索引...我后来注意到了...如果没有索引...每次都会爬整个表...它会非常慢...所以索引非常重要...它可以节省很多时间...
它也用于编程...像Python...创建一个my_list列表...里面可能有重复的项目...只需使用set(my_list)...重复项将立即被删除...但是要小心...Set没有排序...如果你关心顺序...例如,排序列表...日期必须按顺序...你不能直接使用set...你必须使用unique_list=[x for i, x in enumerate(my_list) if 2 02 2 ...那种处理流程...数据量太大...不能做内存去重...必须使用分布式设备...比如Apache Spark...或者Flink...其中...distinct()操作...分布式去重...我看了论文...说性能很好...适合大数据...但是怎么做分布式计算...完全没看懂...
另外...你可以自己写函数去重...这个更灵活...但是你必须编写自己的逻辑...例如...按用户ID去重...你必须自己经历...比较每个对象的ID...我之前写过这个...使用字典...键是用户ID...值是任意。
...这样会自动去重...但是要小心...比较和遍历也需要优化...不然全遍历...还是会慢...你需要选择一个好的数据结构和好的算法...
独特...核心是去重...保证结果唯一...但是它用在很多地方...不只是简单的去重...如果你想高效...你需要了解...如何使用数据库...如何使用集合...如何使用分布式分布...以及如何编写自己的函数...取决于场景...选择正确的方法...索引...算法...所有这些都需要考虑...

sql:关于distinct的用法

说实话,当我第一次接触 SQL 时,DISTINCT 确实让我很困扰。
我记得第一次写查询的时候,我想统计某个部门所有不同的职位,所以我用了DISTINCT。
结果数据太小了,我都出汗了。
后来我才知道,并不是数据库跟我作对,而是我不了解它的规则。

DISTINCT,简单来说,可以帮助您筛选出结果中的“重灾区”。
例如,如果您检查“Users”表,由于人为错误或数据冗余,相同的用户名可能会重复五次。
如果直接查所有的记录,那就乱七八糟了。
这时候加上DISTINCT,数据库会自动帮你合并那些相同的行,只留下一个委托。
就像去菜市场收蔬菜一样。
摊主使用 DISTINCT 将重复的西红柿叠在一起并为您整个称重,而不是单独称重五公斤。

有趣的是,它不仅可以单独使用,还可以与复合功能结合使用。
之前有一个项目,想要统计不同城市的客户数量,只能使用COUNT(DISTINCT城市)。
这比先按城市分组再统计要简单得多。
但使用时要小心。
例如,如果使用 COUNT(DISTINCT Age) 来统计年龄组,结果发现数据库将所有 0 岁婴儿统计为“1 ”,则数据可能会失真。
会去的。
我在处理一个表时发现使用DISTINCT Age得到的结果小于实际年龄组。
经过排查,发现对方的系统把生日填空了,而且数据库默认的都是一样的。

最令人困惑的是它影响整条线。
我有一个老同事,写了一个复杂的查询,想要计算不同订单的总金额。
原来使用DISTINCT后金额计算错误。
经过分析发现Orders表有三列:Customer ID、Order Number、Amount。
他忘记在客户 ID 中添加 DISTINCT,导致相同的金额被计算多次。
这个教训是非常深刻的。
现在写SQL的时候先在纸上建立一个表结构,并在DISTINCT中明确标明什么该加什么不该加。

在表现方面,我不得不承认我克服了一些缺点。
需要一份报告来检查具有数百万条记录的不同产品组合。
我直接加了DISTINCT,跑了十分钟。
后来别人把DISTINCT去掉,用GROUP BY Product A、Product B、Product C,结果马上就回来了。
这让我明白了数据库不是傻子。
它必须首先扫描整个表,然后释放内存以删除重复项。
如果内存不够,就更换硬盘,速度慢如蜗牛。
我们团队现在有一个规则,就是不能使用可以用 GROUP BY 解决的 DISTINCT,除非数据量真的很小。

我记得块数据X,但是我建议你现在检查一下各个数据库的具体性能。
比如Oracle对于DISTINCT就特别“暴力”,而MySQL则相对聪明。
当时我正在使用SQL Server,发现超过一定列数的DISTINCT特别卡,所以我将其重写为临时表以去除重复。

我自己没有这样做过,但我听说有些数据库对于 DISTINCT+JOIN 的优化特别差。
比如你查两张表A和B,A有DISTINCT,结果需要和B相关,那么数据库可能会先去重然后关联,最后再排序。
这时候换个思路,比如先ASSOCIATE再DISTINCT,或者配合Common Table Expression(CTE)一起逐步处理,性能会好很多。