查询表中某一个字段的数字最大值的记录

时间:2022-01-10 12:59:11

这个是一个csdn上有人问的一个题目,具体的题目如下:

数据库表 表1
  id name  
  1 DB-235-aa-fc
  2 DB-275-ag-fw
  3 DB-235-ajj-fj
  4 DB-4444444-ss-fq
  5 DB-2222-kkk-fh
  6 DB-997-ii-fw
  . .
  . .
  里面几千,几万条  


在数据库中写查询语句,查询name字段,第一个‘-’和第二个‘-’之间的最大的那个数!
也就是把第4条数据查询出来! 

这里给出了两种解法:(1)是利用游标(在利用游标之前,会先过滤一下数据集,让数据集的记录变小,这样可以大大的缩小游标所花的时间)具体的Sql代码如下:

create table #t
(
id int not null identity(1,1) primary key,
name varchar(100) not null
)

insert #t(name)
values
('DB-235-aa-fc'),
('DB-275-ag-fw'),
('DB-235-ajj-fj'),
('DB-4444444-ss-fq'),
('DB-2222-kkk-fh'),
('DB-997-ii-fw')

--下面的select就是缩小了结果集
select *
into #lists
from #t
where len(SUBSTRING(name,1,CHARINDEX('-',name,4)-1))
in(
select max(len(SUBSTRING(name,1,CHARINDEX('-',name,4)-1))) from #t)

declare @name varchar(100)
declare @id int
declare @max int
set @max=-1

declare c cursor for
select * from #lists
open c
fetch next from c into @id,@name
while @@FETCH_STATUS=0
begin

set @name=SUBSTRING(@name,1,CHARINDEX('-',@name,4)-1)
set @name=SUBSTRING(@name,4,LEN(@name)-3)
if(CAST(@name as int)>@max)
begin
 set @max=CAST(@name as int)
 set @id=@id
end

fetch next from c into @id,@name
end
close c
deallocate c

select * from #lists
where id=@id

drop table #lists
drop table #t

方法2:直接的操作,利用MAX(int),Sql代码如下:

create table #t
(
id int not null identity(1,1) primary key,
name varchar(100) not null
)

insert #t(name)
values
('DB-235-aa-fc'),
('DB-275-ag-fw'),
('DB-235-ajj-fj'),
('DB-4444444-ss-fq'),
('DB-2222-kkk-fh'),
('DB-997-ii-fw')

select * from #t
where SUBSTRING(SUBSTRING(name,1,CHARINDEX('-',name,4)-1),4,LEN(SUBSTRING(name,1,CHARINDEX('-',name,4)-1))-3)
in(
select max(CAST(SUBSTRING(SUBSTRING(name,1,CHARINDEX('-',name,4)-1),4,LEN(SUBSTRING(name,1,CHARINDEX('-',name,4)-1))-3) AS int))
from #t
)

drop table #t

结果都是相同的:4    DB-4444444-ss-fq