首先,因为不知道您用的是什么数据库。
如下,仅以Oracle为例,希望可以触动您的灵感,SQL如下:
select
t2
from (
select
t1,
rank() over(partition by t1编号 order by t1日期 desc) as rk
from contract t1
) t2 where 1=1
and t2rk = 1
语句简介:以“t1编号”为分区维度,每个分区再以“t1日期 desc”为排序规则,返回每个分区排序后的顺序号,每个分区以 1 为排序起始索引。
SQL取分组中的前几名
[sql] >
这个sql有点麻烦了,
简单点的就直接
select id,name,type,score from student where type='小学生' limit 2 union select id,name,type,score from student where type='中学生' limit 2 ;
或者你用存储过程来做循环:查询出所有type然后在循环里动态给 查询语句中的type复制,有几个type就concat几个union上去,
其他直接写sql查询的话有点难,写不出来
可以通过row_number函数来实现。
如test表中数据如下:
现在要查询按年龄由大到小的第5-10位的人员名单,可用如下语句:
select tid,tname,tagefrom
(select row_number() over(order by age desc) as rn,id,name,age from test) t
where rn between 5 and 10
查询结果:
因分辨不出哪个是原创,链接就不加了。建立表结构如下:CREATE table [dbo][tmp_Trans](
ID int identity,
PO_NO varchar(20) null,
PO_Itemno varchar(20) null,
Qty numeric(18,6) null,
Trans_Date datetime null,
Doc_no varchar(20) null
)要求取相同PO_NO按Trans_Date倒序排序的前两条记录。1Where子句嵌套SELECT的方式。在嵌套的SELECT语句中可以与主表的字段相关联,达到分类的目的。这种方式又有三种写法:1)如果表中有主键,可以用IN的方式。SELECT FROM tmp_Trans t
WHERE ID IN(
SELECT TOP 2 ID
FROM tmp_Trans
WHERE PO_NO=tPO_NO
ORDER BY Trans_Date DESC
) 2)如果没有主键,可以用判断在本条记录前有多少条记录的方式。但使用这种方式时如果遇到Trans_Date相同的情况会不准。如当存在Trans_Date最大的记录有三条时,这三条记录都会查出来。SELECT
FROM tmp_Trans tWHERE (SELECT COUNT()
FROM tmp_Trans
WHERE PO_NO=tPO_NO AND Trans_Date>TTrans_Date
)
第一个SQL语句是语法错误,最外层查询的目标数据表为一个子查询,需要用一个别名来命名:
select sum(chengjiaoliang)from (
select top 5 chengjiaoliang from day_sh
where daima = '600000' and riqi < '2010-05-13 00:00:00'
order by riqi
) s
第二个查询语法没问题,但是得到的不是你想要的结果吧。
这里还要提醒一下: 最好不要用top n来取有排序规定的前N条记录,因为这不能保证取出的N条数据就是这个排序规定下的前N条。最好用分析函数row_number() over来获取排序值,然后再取需要的记录。
以上就是关于数据库分组排序问题在线等急!!一个客户有多条交易记录按照账号和客户编号分组取交易金额前10条的记录全部的内容,包括:数据库分组排序问题在线等急!!一个客户有多条交易记录按照账号和客户编号分组取交易金额前10条的记录、SQL如何对分组后的结果进行排序并且取前几名、mysql 用一条sql语句取出各类数据的前两N条数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)