/*jobid是工作编号*/
createtabletb(idintidentity(1,1)primarykey,jobidchar(12),companyvarchar(50),usernamevarchar(20))
insertintotb
select'080402162220','IBM','jim'unionall
select'080402162220','DELL','John'unionall
select'080403162220','HP','Mary'unionall
select'080403162220','Lenovo','Kate'unionall
select'080404162220','Toshiba','Lucy'unionall
select'080404162220','Canoon','Lili'unionall
select'080405162220','Sony','Bush'
-----------------------------------------------------------------------------------------------------------------------
select*fromtbawherenotexists(select1fromtbwherejobid=a.jobidandid>a.id)

此表结构为(一对多)的关系,jobid为数据重复字段.

Follow SQL about group by DaWugui:

--按某一字段分组取最大(小)值所在行的数据
(爱新觉罗.毓华2007-10-23于浙江杭州)
/*
数据如下:
namevalmemo
a2a2(a的第二个值)
a1a1--a的第一个值
a3a3:a的第三个值
b1b1--b的第一个值
b3b3:b的第三个值
b2b2b2b2b2
b4b4b4
b5b5b5b5b5b5
*/

--创建表并插入数据:
createtabletb(namevarchar(10),valint,memovarchar(20))
insertintotbvalues('a',2,'a2(a的第二个值)')
insertintotbvalues('a',1,'a1--a的第一个值')
insertintotbvalues('a',3,'a3:a的第三个值')
insertintotbvalues('b',1,'b1--b的第一个值')
insertintotbvalues('b',3,'b3:b的第三个值')
insertintotbvalues('b',2,'b2b2b2b2')
insertintotbvalues('b',4,'b4b4')
insertintotbvalues('b',5,'b5b5b5b5b5')
go

--一、按name分组取val最大的值所在行的数据。
--
方法1:
selecta.*fromtbawhereval=(selectmax(val)fromtbwherename=a.name)orderbya.name
--方法2:
selecta.*fromtbawherenotexists(select1fromtbwherename=a.nameandval>a.val)
--方法3:
selecta.*fromtba,(selectname,max(val)valfromtbgroupbyname)bwherea.name=b.nameanda.val=b.valorderbya.name
--方法4:
selecta.*fromtbainnerjoin(selectname,max(val)valfromtbgroupbyname)bona.name=b.nameanda.val=b.valorderbya.name
--方法5
selecta.*fromtbawhere1>(selectcount(*)fromtbwherename=a.nameandval>a.val)orderbya.name
/*
namevalmemo
-----------------------------------------
a3a3:a的第三个值
b5b5b5b5b5b5
*/


--二、按name分组取val最小的值所在行的数据。
--
方法1:
selecta.*fromtbawhereval=(selectmin(val)fromtbwherename=a.name)orderbya.name
--方法2:
selecta.*fromtbawherenotexists(select1fromtbwherename=a.nameandval<a.val)
--方法3:
selecta.*fromtba,(selectname,min(val)valfromtbgroupbyname)bwherea.name=b.nameanda.val=b.valorderbya.name
--方法4:
selecta.*fromtbainnerjoin(selectname,min(val)valfromtbgroupbyname)bona.name=b.nameanda.val=b.valorderbya.name
--方法5
selecta.*fromtbawhere1>(selectcount(*)fromtbwherename=a.nameandval<a.val)orderbya.name
/*
namevalmemo
-----------------------------------------
a1a1--a的第一个值
b1b1--b的第一个值
*/


--三、按name分组取第一次出现的行所在的数据。
selecta.*fromtbawhereval=(selecttop1valfromtbwherename=a.name)orderbya.name
/*
namevalmemo
-----------------------------------------
a2a2(a的第二个值)
b1b1--b的第一个值
*/


--四、按name分组随机取一条数据。
selecta.*fromtbawhereval=(selecttop1valfromtbwherename=a.nameorderbynewid())orderbya.name
/*
namevalmemo
-----------------------------------------
a1a1--a的第一个值
b5b5b5b5b5b5
*/


--五、按name分组取最小的两个(N个)val
selecta.*fromtbawhere2>(selectcount(*)fromtbwherename=a.nameandval<a.val)orderbya.name,a.val
selecta.*fromtbawherevalin(selecttop2valfromtbwherename=a.nameorderbyval)orderbya.name,a.val
selecta.*fromtbawhereexists(selectcount(*)fromtbwherename=a.nameandval<a.valhavingCount(*)<2)orderbya.name
/*
namevalmemo
-----------------------------------------
a1a1--a的第一个值
a2a2(a的第二个值)
b1b1--b的第一个值
b2b2b2b2b2
*/


--六、按name分组取最大的两个(N个)val
selecta.*fromtbawhere2>(selectcount(*)fromtbwherename=a.nameandval>a.val)orderbya.name,a.val
selecta.*fromtbawherevalin(selecttop2valfromtbwherename=a.nameorderbyvaldesc)orderbya.name,a.val
selecta.*fromtbawhereexists(selectcount(*)fromtbwherename=a.nameandval>a.valhavingCount(*)<2)orderbya.name
/*
namevalmemo
-----------------------------------------
a2a2(a的第二个值)
a3a3:a的第三个值
b4b4b4
b5b5b5b5b5b5
*/

--七,如果整行数据有重复,所有的列都相同。
/*
数据如下:
namevalmemo
a2a2(a的第二个值)
a1a1--a的第一个值
a1a1--a的第一个值
a3a3:a的第三个值
a3a3:a的第三个值
b1b1--b的第一个值
b3b3:b的第三个值
b2b2b2b2b2
b4b4b4
b5b5b5b5b5b5
*/

--在sqlserver2000中只能用一个临时表来解决,生成一个自增列,先对val取最大或最小,然后再通过自增列来取数据。
--
创建表并插入数据:
createtabletb(namevarchar(10),valint,memovarchar(20))
insertintotbvalues('a',2,'a2(a的第二个值)')
insertintotbvalues('a',1,'a1--a的第一个值')
insertintotbvalues('a',1,'a1--a的第一个值')
insertintotbvalues('a',3,'a3:a的第三个值')
insertintotbvalues('a',3,'a3:a的第三个值')
insertintotbvalues('b',1,'b1--b的第一个值')
insertintotbvalues('b',3,'b3:b的第三个值')
insertintotbvalues('b',2,'b2b2b2b2')
insertintotbvalues('b',4,'b4b4')
insertintotbvalues('b',5,'b5b5b5b5b5')
go

select*,px=identity(int,1,1)intotmpfromtb

selectm.name,m.val,m.memofrom
(
selectt.*fromtmptwhereval=(selectmin(val)fromtmpwherename=t.name)
)m
wherepx=(selectmin(px)from
(
selectt.*fromtmptwhereval=(selectmin(val)fromtmpwherename=t.name)
)n
wheren.name=m.name)

droptabletb,tmp

/*
namevalmemo
-----------------------------------------
a1a1--a的第一个值
b1b1--b的第一个值

(2行受影响)
*/

--在sqlserver2005中可以使用row_number函数,不需要使用临时表。
--
创建表并插入数据:
createtabletb(namevarchar(10),valint,memovarchar(20))
insertintotbvalues('a',2,'a2(a的第二个值)')
insertintotbvalues('a',1,'a1--a的第一个值')
insertintotbvalues('a',1,'a1--a的第一个值')
insertintotbvalues('a',3,'a3:a的第三个值')
insertintotbvalues('a',3,'a3:a的第三个值')
insertintotbvalues('b',1,'b1--b的第一个值')
insertintotbvalues('b',3,'b3:b的第三个值')
insertintotbvalues('b',2,'b2b2b2b2')
insertintotbvalues('b',4,'b4b4')
insertintotbvalues('b',5,'b5b5b5b5b5')
go

selectm.name,m.val,m.memofrom
(
select*,px=row_number()over(orderbyname,val)fromtb
)m
wherepx=(selectmin(px)from
(
select*,px=row_number()over(orderbyname,val)fromtb
)n
wheren.name=m.name)

droptabletb

/*
namevalmemo
-----------------------------------------
a1a1--a的第一个值
b1b1--b的第一个值

(2行受影响)
*/

更多相关文章

  1. 利用纯真IP库建立mysql ip数据库
  2. Linux服务器安装php之后连接MySQL数据失败
  3. NoSQL_Cassandra_导出数据库结构/数据库结构还原
  4. 约束数据库表,以便只有一行可以在列中具有特定值
  5. ubuntu16.04 mysql5.7.20表中插入中文显示???的解决方法
  6. 数据库截取字符串SUBSTR函数的使用
  7. 如何使用特定数据的所有可能实例填充数据表?
  8. SQL服务器数据部分的年和月
  9. SQL Server 中 存储“经纬度”应设置的数据类型

随机推荐

  1. .Net Core配置与自动更新的实现方法_实用
  2. C#中.NET框架的简介
  3. Razor TagHelper实现Markdown转HTML的方
  4. C#开发之微信小程序发送模板消息功能
  5. 在.NET Core类库中使用EF Core迁移数据库
  6. C#对Word文档的创建、插入表格、设置样式
  7. Asp.NET控制文件上传的大小方法(超简单)_
  8. c++如何获取数值极值的办法
  9. ADO调用分页查询存储过程的实例讲解_实用
  10. 关于c++中的引用总结