sql去重,同一个字段出现多条取一条的sql语句

嗯...我在 2 02 2 年遇到了 SQL 弃用问题。
我不记得我们当时在哪个城市,但无论如何这是一个项目。
数据量巨大。
例如,有几十万条记录,其中某个字段,例如“订单号”重复次数很多。
该怎么办?只要找到减肥的方法就可以了。

后来我发现,我们其实可以使用子查询和windows函数。
例如,我想分配“订单号”字段,然后每组中只放一条记录,第一个就可以了。
我写的SQL是这样的:
sql 选择b。
从 ( 选择一个。
ROW_NUMBER() EXTEND ( PARTITION IN A . ORDER NUMBER ) AS group_idx FROM 表名 a ) b 其中 b.group_idx = '1 '
你看,这里使用了ROW_NUMBER()函数。
该任务是对每个“订单号”组中的每条记录进行排名,从 1 开始并继续。
然后在外层查询中,我只选择group_idx为1 的记录,这样每个订单就只剩下一个数字了,放在第一位。
但有时按“订单号”分组还不够。
比如同一个“序号”下可能有多个“创建时间”,那么我想保留最新的“创建时间”。
这次,我将在 ROW_NUMBER() 函数中添加排序条件。
更新后的SQL如下:
sql 选择b。
从 ( 选择一个。
ROW_NUMBER() OVER (PARTITION IN A .ORDER NUMBER ORDER IN A .CREATIONTIME DESC ) AS GROUP_IDX FROM 表名 a ) b 其中 b.group_idx = '1 '
你看,按 a 订购。
此处添加了创建时间 DESC。
这意味着每个“序列号”组首先按“创建时间”排序,然后 ROW_NUMBER() 函数将最接近的记录号设置为 1 只有在外部查询中 group_idx 设置为 1 的记录才会被选择。
这样,我们就可以保证每个“订单号”下只保留“创建时间”最新的记录。
解决减法问题。
当时我很困惑,但后来我明白了。
也许我太极端了,认为这是唯一的方法。
无论如何,结果是好的,减少了数据量,解决了问题。

ORACLE SQL语句查询一个字段在另一表字段中有两条或以上 的数据

那天,我在办公室加班,在电脑里敲代码,突然想起数据库的问题。
我随手在一张纸上画了两张桌子。
一个叫学生表,一个叫班级表,中间通过学生ID连接起来。
学生表中有 5 个学生,班级表中有 6 个班级。
有些学生只在一个班,而另一些学生则在两个班。

我创建了一个 SQL 查询来查看哪些学生属于多个班级。
首先,创建两个表 test_student 和 test_class,并填充数据。
学生表有1 001 到1 004 4 个学生,班级表有C01 到C06 6 个班级。
1 001 和1 004 各参加两个班级。

运行查询后,结果显示 1 001 和 1 004 正在参加多个班级。
这个查询非常有趣。
使用group by和have语句对具有相同学号的记录进行分组,并过滤​​掉数字大于1 的记录。
这让我想起了之前做项目时使用类似的方法来统计用户活动。
每天至少登录两次的用户后来成为忠实用户。

等等,还有一件事:插入数据时,我注意到在test_class表中,学生1 004 加入了C01 班级两次。
如果按照现实场景,学生一次只需要上一堂课,这个数据有问题吗?我需要回去和业务部门核实一下。

sql一列有多值查询,根据多个只查询我想要的数据

哈,这两种方法各有优点。
我在一家互联网公司做数据分析师的时候,也遇到过类似的场景。

首先说第一种方法,就是分别查询每个条件,然后取交集。
在Oracle中使用INTERSECT非常容易,可以一次性得到满足所有条件的结果。
但这种方法有一个缺点,就是如果条件太多,查询效率可能会受到影响。
记得当时我们公司如果用这种方式运行一个大型电子表格,需要几分钟的时间,这还是影响了数据分析的效率。

再说第二种方式,这个比较巧合。
你看,我观察得很仔细,发现每条数据都是以数字4 1 、4 2 、4 3 、4 4 开始的,下面是它们的顺序。
然后直接使用GROUP BY处理,合并propertyValueID字段。
只要结果有1 3 5 8 ,就会显示出来。
如果没有,则不会显示。
这种方法肯定比第一种方法效率更高,尤其是数据量很大的时候。

不过,我也很喜欢你提到的4 1 1 、4 2 3 、4 3 5 、4 4 8 这样的合并字段,这样排序和合并就不会出现问题,保证数据的准确性。
我个人觉得,如果你的数据符合这个模式,第二种方法应该更合适。

不过话虽如此,实际操作还是要根据具体情况来确定。
例如,如果业务需求发生变化或者数据结构发生变化,你可能就必须改变方法。
无论如何,这取决于你,无论哪种方法最适合你的需要,就使用它。
我还在思考这个问题。