`
wangpengfei360
  • 浏览: 1059205 次
文章分类
社区版块
存档分类
最新评论

SQL :多条记录取最前面一条或根据条件任取N条。。。。。。

 
阅读更多
--按某一字段分组取最大(小)值所在行的数据

/*
数据如下:
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行受影响)
*/

按Rdate分组取num最小的值所在行的数据。并根据主从表ID左关联取主表的所有字段。。。。

select a.*,b.* from child a left join parent as b on b.id=a.PID where num = (select min(num) from child where Rdate = a.Rdate)

//三表联合查询.....

select info.PriceStartDate, Res_Golf.* from Res_Golf left join ( select Erp_GolfID,max(PriceStartDate) as PriceStartDate from Res_GolfInfo left join (select Erp_GolfInfoID,PriceStartDate from Res_GolfPrice where PriceStartDate > '2011-07-18' group by Erp_GolfInfoID,PriceStartDate ) as pri on Res_GolfInfo.GolfInfoID=pri.Erp_GolfInfoID group by Erp_GolfID) as info on Res_Golf.Erp_GolfID=info.Erp_GolfID

or

select a.Erp_GolfID, MAX(b.PriceStartDate) from Res_Golf a inner join (select a.Erp_GolfID,b.PriceStartDate from Res_GolfInfo a inner join Res_GolfPrice b on a.GolfInfoID=b.Erp_GolfInfoID group by a.Erp_GolfID,b.PriceStartDate) b on a.Erp_GolfID=b.Erp_GolfID group by a.Erp_GolfID


分享到:
评论

相关推荐

    2009达内SQL学习笔记

    多条SQL语句必须以分号分隔。多数DBMS不需要在单条SQL语句后加分号,但特定的DBMS可能必须在单条SQL语句后加分号。 SQL语句的最后一句要以 “;”号结束 二、写子句顺序 Select column,group_function From ...

    经典SQL语句大全

    13、说明:一条sql 语句搞定数据库分页 select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段 具体实现: ...

    MYSQL常用命令大全

    例如,往表 MyClass中插入二条记录, 这二条记录表示:编号为1的名为Tom的成绩为96.45, 编号为2 的名为Joan 的成绩为82.99,编号为3 的名为Wang 的成绩为96.5. mysql&gt; insert into MyClass values(1,'Tom',96.45),(2,...

    sql经典语句一部分

    13、说明:一条sql 语句搞定数据库分页 select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段 具体实现: ...

    数据库操作语句大全(sql)

    13、说明:一条sql 语句搞定数据库分页 select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段 具体实现: ...

    T-SQL高级查询

    --top 取前N条记录 select top 3 * from student; --alias column name 列重命名 select id as 编号, name '名称', sex 性别 from student; --alias table name 表重命名 select id, name, s.id, s.name from ...

    MySQL命令大全

    例如,往表 MyClass中插入二条记录, 这二条记录表示:编号为的名为Tom的成绩为.45, 编号为 的名为Joan 的成绩为.99,编号为 的名为Wang 的成绩为.5. mysql&gt;insert into MyClass values(1,’Tom’,96.45),(2,’Joan...

    orcale常用命令

    使用INPUT命令可以在SQL缓冲区中增加一行或多行 SQL&gt;i SQL&gt;输入内容 e、调用外部系统编辑器 SQL&gt;edit 文件名 可以使用DEFINE命令设置系统变量EDITOR来改变文本编辑器的类型,在login.sql文件中定义如下一行 DEFINE_...

    ORACLE,mysql,sqlserver,sybase数据库装文本软件

    每条记录结尾的分隔符,默认是 \r\n回车换行符,支持前面-c参数说的转义符 oracle例子: 登陆scott用户,裝载a.txt的逗号分隔的gbk编码文本内容到scott.emp java -jar xxx.jar -i 127.0.0.1 -p 1521 -s ora10 -u ...

    mysql数据库的基本操作语法

    Ø 常用查询 MySQL结束符是“;”结束。 1、 显示所有数据库 show databases; 2、 删除数据库 drop database dbName; 3、 创建数据库 create database [if not exists] dbName;...可以完成单条记录、多条记录、单表...

    最全的oracle常用命令大全.txt

    使用INPUT命令可以在SQL缓冲区中增加一行或多行 SQL&gt;i SQL&gt;输入内容 e、调用外部系统编辑器 SQL&gt;edit 文件名 可以使用DEFINE命令设置系统变量EDITOR来改变文本编辑器的类型,在login.sql文件中定义如下一行 DEFINE_...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以分布式数据库为核心的一组软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一。  拉里•埃里森  就业前景 从就业与择业的...

    mysql分页查询优化,大数据量优化

    对于此类操作,获取前面少数几行数据会很快,但是随着扫描的记录数越多,SQL的性能就会越差,因为N的值越大,MySQL需要扫描越多的数据来定位到具体的N行,这样耗费大量的 IO 成本和时间成本。 特别是上线后数据量...

    MySQL 入门学习 ——基础教程

    我们可以按此方法一条一条地将所有员工的记录加入到表中。 · 7、用文本方式将数据装入一个数据库表 如果一条一条地输入,很麻烦。我们可以用文本文件的方式将所有记录加入你的数据库表中。 创建一个文本文件...

    cmd操作命令和linux命令大全收集

    CMD命令:开始-&gt;运行-&gt;键入cmd或command(在命令行里可以看到系统版本、文件系统版本) 命令大全 1. gpedit.msc-----组策略 2. sndrec32-------录音机 3. Nslookup-------IP地址侦测器 ,是一个 监测网络中 DNS...

    arcgis工具

    Shift:添加至/取消选择 Ctrl:移动选择锚 N:下一个被选要素 R:切换至旋转模式/从旋转模式切换 F:切换至要素模式/从要素模式切换 E:在Sketch工具、Edit工具和Edit Annotation工具间切换 L:在跟踪要素模式下将...

    研究Python的ORM框架中的SQLAlchemy库的映射关系

    这种联系在数据库理论中是典型的1-N (一对多)关系,用户表某一用户对应N条电子邮件记录。 之前我们的用户表称为users,现在我们再建立一张被称为addresses的表用于存储电子邮件地址,通过Declarative系统,我们可以...

    delphi 开发经验技巧宝典源码

    第1章 开发环境 1 1.1 环境设置 2 0001 如何定制工具栏 2 ...0296 如何在屏幕最前面显示滚动字幕 192 0297 制作磁性窗体 193 0298 制作浮动窗口 194 0299 制作另类提示窗口 195 0300 将窗体...

Global site tag (gtag.js) - Google Analytics