sql去重

sql针对某一字段去重,并且保留其他字段

北战南征 提交于 2020-02-25 17:32:06
今天客户提了一个小需求,希望我能提供一条sql语句,帮助他对数据中 _field 这个字段的值去重,并且保留其他字段的数据。第一反应是select distinct,但这种语句在对某个字段去重时,无法保留其他字段,所以select distinct不成立。因为用户对去重没有要求,字段值重复时保留任意一行就行,所以我想到当字段值重复时,选出对应主键最大的那条数据作为保留数据,这样可以实现用户的去重需求。但是用户的表中又没有主键,没办法,我们只好先使用窗口函数创建主键了。 因为平时喜欢用hive on spark写sql,所以sql语句使用中间表的形式来写,_field为去重字段,other_fields为原表table中_field外的其他字段 1.创建主键(存在主键则无需创建,窗口函数需要遍历所有行数据,数据量大时会很慢) TEMP table1 = select row_number() over (order by _field) as id, _field, other_fields from table 2.选出每个_field对应的最大主键 TEMP table2 = select max(id) as max_id from table1 group by _field 3.找出选中的主键对应的原表数据 TEMP table3 = select _field,

SQL去重distinct方法解析

孤人 提交于 2020-01-24 14:37:34
一 distinct 含义: distinct 用来查询不重复记录的条数 , 即 distinct 来返回不重复字段的条数( count(distinct id) ) , 其原因是 distinct 只能返回他的目标字段,而无法返回其他字段 用法注意: 1.distinct 【查询字段】, 必须放在要查询字段的开头 ,即放在第一个参数; 2. 只能在 SELECT 语句中使用,不能在 INSERT, DELETE, UPDATE 中使用; 3.DISTINCT 表示对后面的所有参数的拼接取 不重复的记录,即查出的参数拼接每行记录都是唯一的 4.不能与all同时使用,默认情况下,查询时返回的就是所有的结果。 1.1只对一个字段查重 对一个字段查重,表示选取该字段一列不重复的数据。 示例表: psur_list PLAN_NUMBER字段去重, 语句:SELECT DISTINCT PLAN_NUMBER FROM psur_list; 结果如下: 1.2多个字段去重 对多个字段去重,表示选取多个字段拼接的一条记录,不重复的所有记录 示例表: psur_list PLAN_NUMBER和PRODUCT_NAME字段去重, 语句:SELECT DISTINCT PLAN_NUMBER,PRODUCT_NAME FROM psur_list; 结果如下: 期望结果:只对第一个参数PLAN

SQL中的三种去重方法

烂漫一生 提交于 2020-01-09 04:12:20
在使用SQL提数的时候,常会遇到表内有重复值的时候,比如我们想得到 uv (独立访客),就需要做去重。 在 MySQL 中通常是使用 distinct 或 group by 子句,但在支持窗口函数的 sql(如Hive SQL、Oracle等等) 中还可以使用 row_number 窗口函数进行去重。 举个栗子,现有这样一张表 task : task_id order_id start_time 1 123 2020-01-05 1 213 2020-01-06 1 321 2020-01-07 2 456 2020-01-06 2 465 2020-01-07 3 798 2020-01-06 备注: task_id: 任务id; order_id: 订单id; start_time: 开始时间 注意:一个任务对应多条订单 我们需要求出任务的总数量,因为 task_id 并非唯一的,所以需要去重: distinct -- 列出 task_id 的所有唯一值(去重后的记录) -- select distinct task_id -- from Task; -- 任务总数 select count ( distinct task_id ) task_num from Task ; distinct 通常效率较低。它不适合用来展示去重后具体的值,一般与 count 配合用来计算条数。

sql去重;同一条数据出现多条取一条的sql语句

眉间皱痕 提交于 2020-01-03 15:37:37
理论上相同数据个别字段值不同重复问题: 1.某字段重复,其他字段值不同时,按重复字段分组只取一条的sql语句 (eg:相同的数据某个字段值有差别导致存储两条或多条无意义重复数据的情况) select s.* from ( select a.*, row_number() over (partition by [重复字段] order by [不同字段]) as group_idx from table_name a ) s where s.group_idx= 1 2.某字段重复,其他字段不同,取重复字段值并去重sql语句(第二句复制过来的,未测试) (1)select distinct a.id from a (2)select id from a where a.num = 1 group by id having on count(id) > 1 ===================删除重复数据保留一条================================== 3、查找表中多余的重复记录(多个字段) select * from vitae a where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1) 4

Sql去重

杀马特。学长 韩版系。学妹 提交于 2019-12-05 06:29:58
原文链接:https://www.jianshu.com/p/4a10aac1293c 1.存在两条完全相同的纪录 这是最简单的一种情况,用关键字 distinct 就可以去掉 例子: select distinct * from table(表名) where (条件) 2.存在部分字段相同的纪录(有主键id即唯一键) 如果是这种情况的话用 distinct 是过滤不了的,这就要用到主键id的唯一性特点及 group by 分组 例子: select * from table where id in (select max(id) from table group by [去除重复的字段名列表,....]) 3.没有唯一键ID 这种情况我觉得最复杂,目前我只会一种方法,有那位知道其他方法的可以留言,交流一下: 例子: select identity(int,1,1) as id,* into newtable(临时表) from table select * from newtable where id in (select max(id) from newtable group by [去除重复的字段名列表,....]) drop table newtable 来源: https://www.cnblogs.com/imtudou/p/11339653.html

SQL 去重 DISTINCT 语法

送分小仙女□ 提交于 2019-11-30 23:11:42
SQL SELECT DISTINCT语句 在表中可能会包含重复值。这并不成问题, 不过有时你也许希望仅仅列出不同(distinct)的值。 关键词DISTINCT 用于返回唯一不同的值 语法 SELECT DISTINCT 列名称 FROM 表名称 使用DISTINCT关键词 如果要从Company列中选取所有的值,我们需要使用SELECT语句: SELECT Company FROM Orders “Orders”表 Company OrderNumber IBM 3532 W3School 2356 Apple 4698 W3School 6953 结果: Company IBM W3School Apple W3School 请仔细看,在结果集中,W3School被列出了两次。 如需从“Company”列中仅选取唯一不同的值,我们需要使用SELECT DISTINCT语句: SELECT DISTINCT Company FROM Orders 结果: Company IBM W3School Apple 现在,在结果集中,“W3School”仅被列出了一次 来源: https://www.cnblogs.com/ljknlb/p/11644189.html

SQL去重distinct方法解析

可紊 提交于 2019-11-29 21:38:32
来源:https://www.cnblogs.com/lixuefang69/p/10420186.html SQL去重distinct方法解析 一 distinct 含义: distinct用来查询不重复记录的条数,即distinct来返回不重复字段的条数(count(distinct id)),其原因是distinct只能返回他的目标字段,而无法返回其他字段 用法注意: 1.distinct 【查询字段】,必须放在要查询字段的开头,即放在第一个参数; 2.只能在SELECT 语句中使用,不能在 INSERT, DELETE, UPDATE 中使用; 3.DISTINCT 表示对后面的所有参数的拼接取 不重复的记录,即查出的参数拼接每行记录都是唯一的 4.不能与all同时使用,默认情况下,查询时返回的就是所有的结果。 1.1只对一个字段查重 对一个字段查重,表示选取该字段一列不重复的数据。 示例表: psur_list PLAN_NUMBER字段去重,语句:SELECT DISTINCT PLAN_NUMBER FROM psur_list; 结果如下: 1.2多个字段去重 对多个字段去重,表示选取多个字段拼接的一条记录,不重复的所有记录 示例表: psur_list PLAN_NUMBER和PRODUCT_NAME字段去重,语句:SELECT DISTINCT PLAN

sql语句_ 的三种去重方法

时光毁灭记忆、已成空白 提交于 2019-11-29 15:06:56
本文将介绍用 distict、group by 和 row_number() over 。 注:这里的去重是指:查询的时候, 不显示重复,并不是删除表中的重复项,关系删除表中重复数据的sql 请参考一下链接: https://www.cnblogs.com/171207xiaohutu/p/11520763.html 1. distinct 表userinfo 数据如下: id name age height 10 xiaogang 23 181 11 xiaoli 31 176 12 xiaohei 22 152 13 xiaogang 26 172 14 xiaoming 31 176 现在需要当前用户表不重复的用户名select distinct name from userinfo 如结果(1):name xiaogangxiaoheixiaolixiaoming 可是我现在又想得到Id的值,改动如下 select distinct name,id from userinfo 如结果(2) xiaogang 10 xiaoli 11 xiaohei 12 xiaogang 13 xiaoming 14 此时distinct同时作用了两个字段,即必须得id与name都相同的才会被排除 2. group by select name from userinfo groub by