sql 语句查询 按某字段去重 保留按某个字段排序top1

例子:

     建表: create table tablename  (id int identity(1,1),attachid int,name varchar(10))

      insert into tablename  values(23,‘sss‘)

      insert into tablename   values(33,‘sdfs‘)

      insert into tablename   values(33,‘4434‘)

      insert into tablename   values(45,‘dsdsd‘)

        select from  tablename  as  a where not exists (select from  tablename  where attachid=a.attachid and name<a.name)   

                                                 内层的    外层的       内层   外层

                                                 按某个字段去重              保留按某个字段排序的最大/小值

后面括号里的意思是再从原表中找有没有比当前记录相同字段的比较字段更大或更小的 如果有  则不插入  如果没有  则插入

exists   是个条件  后面的结果集有值的时候 条件成立   后面结果集为空的时候 条件不成立   所以后面子查询中select 后面跟什么字段不重要  关键是看结果集是否为空

加not  是取相反的意思

name <a.name 是取最小的     反之是取最大的

  

原数据

id  attachid name
1    23       sss
2    33       sdfs
3    33       4434
4    45       dsdsd

比较后

id          attachid    name

----------- ----------- ----------

1           23          sss

3           33          4434

4           45          dsdsd

注意:from后面不能跟别名只能跟临时表 #table

复杂一点的例子:

查询 WorkFlowTask 表中 ReceiveID为某值 而且状态是2或者3的 记录  而且在同样GroupID 中只保留时间最新的  并且结果按完成时间排序

(select * from
( SELECT *,ROW_NUMBER() OVER(ORDER BY CompletedTime1 DESC) AS PagerAutoRowNumber
FROM WorkFlowTask
WHERE ReceiveID=‘00000000-0000-0000-0000-000000009667‘ AND [Status] IN(2,3) ) as a
where not exists  --其实后面只是一个查询条件(包含子查询)
        (select 1 from WorkFlowTask
           where GroupID=a.GroupID and ReceiveTime>a.ReceiveTime and ReceiveID=‘00000000-0000-0000-0000-000000009667‘ AND [Status] IN(2,3)
         )

时间: 2024-08-01 19:24:02

sql 语句查询 按某字段去重 保留按某个字段排序top1的相关文章

sql语句查询同一表内多字段同时重复的记录 sql数据库重复记录删除

分享下用sql语句删除数据库中重复记录的方法.比如现在有一人员表 (表名:peosons) 若想将姓名.身份证号.住址这三个字段完全相同的记录查询出来select p1.* from persons p1,persons p2 where p1.id<>p2.id and p1.cardid = p2.cardid and p1.pname = p2.pname and p1.address = p2.address可以实现上述效果.几个删除重复记录的SQL语句 1.用rowid方法2.用gr

sql语句查询重复的数据

查找所有重复标题的记录:SELECT *FROM t_info aWHERE ((SELECT COUNT(*)FROM t_infoWHERE Title = a.Title) > 1)ORDER BY Title DESC一.查找重复记录1.查找全部重复记录Select * From 表 Where 重复字段 In (Select 重复字段 From 表 Group By 重复字段 Having Count(*)>1)2.过滤重复记录(只显示一条)Select * From HZT Whe

sql语句查询经纬度范围

指定一个经纬度,给定一个范围值(单位:千米),查出在经纬度周围这个范围内的数据. 经度:113.914619 纬度:22.50128 范围:2km longitude为数据表经度字段 latitude为数据表纬度字段 SQL在mysql下测试通过,其他数据库可能需要修改 SQL语句如下: select * from location where sqrt( ( ((113.914619-longitude)*PI()*12656*cos(((22.50128+latitude)/2)*PI()/

提高SQL语句查询效率

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0 3.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放

sql语句查询条件的不同表达方式对查询性能的影响

今天操作数据库遇到一个问题 目标表RA_AD_DAILY_DATA的数据量大概有5千万左右,其中的BUSINESS_DATE字段为日期类型 我要查询8月20号导入的三条记录,刚开始用这种方式去查: SELECT * FROM RA_AD_DAILY_DATA WHERE  to_char(BUSINESS_DATE,'yyyy-MM-dd')= '2014-08-20' ; 速度非常慢,五分钟左右才能出来结果(在PL/SQL developer中) 同样都是查询2014年8月20日的数据,换一种

sql语句查询数据库表结构信息

开发中经常用到查询指定表及其字段的信息,以下是我整理的SQL语句查询方法,供自己平时使用也提供给大家参考! 1.适用MS SQL SERVER: 1 SELECT 2 表名 = case when a.colorder=1 then d.name else '' end, 3 表说明 = case when a.colorder=1 then isnull(f.value,'') else '' end, 4 字段序号 = a.colorder, 5 字段名 = a.name, 6 标识 = c

使用sql语句查询日期在一定时间内的数据

使用sql语句查询日期在一周内的数据 select * from ShopOrder where datediff(week,ordTime,getdate()-1)=0   //查询当天日期在一周年的数据 select * from ShopOrder where datediff(day,ordTime,getdate()-1)=0   //查询当天的所有数据 SELECT * FROM A where datediff(d,datetime,getdate()) <=30 //前30天 S

ORACLE基本SQL语句-查询篇

一.普通查询 /*查询表数据*/select * from STU /*取出前3行数据*/select * from stu where ROWNUM<=3 /*模糊查询*/select * from stu where stu_id like 'stu001%' 说明:通配符“%”代表一个或者多个字符,通配符“_”代表一个字符. /*别名*/select STU_ID as 学号 from stu 二.联合查询/*普通联合查询*/SELECT STU.STU_NAME, STU.STU_AGE

sql语句查询后几行数据并倒着排列

$conn = mysql_connect("数据库地址","用户名","密码"); if(!$conn) { die("mysql conn failed"); } else{ mysql_query("SET NAMES 'utf8'"); mysql_select_db("数据表",$conn); if(!$conn) { die("database selected f