还有一张数据表,格式如下:
ID | NAME | LEVEL | DATE
---------------------------------------
1 name1 1 2005-6-8 15:39:20
2 name2 3 2005-6-7 15:39:20
4 name1 4 2005-6-5 15:39:20
6 name3 2 2005-6-9 15:39:20
7 name3 2 2005-6-8 15:45:20
8 name4 4 2005-6-9 15:45:20
........
现在要求在字符串中所有的name下的level最大的详细记录,示例如下:
ID | NAME | LEVEL | DATE
---------------------------------------
2 name2 3 2005-6-7 15:39:20
4 name1 4 2005-6-5 15:39:20
6 name3 2 2005-6-9 15:39:20
即:1》name要显示所有字符串中的,其他的不显示
2》结果中的其他详细字段值为表中符合条件的level最大值的所在行
8 个解决方案
#1
还有一个条件:
3》 结果中的其他详细字段值为表中符合条件的level最大值、并且时间最近一条数据的所在行
3》 结果中的其他详细字段值为表中符合条件的level最大值、并且时间最近一条数据的所在行
#2
'name1','name2','name3'生成一个表变量,然后用这个表变量与数据表关联查询。
查询时先找出LEVEL最大的记录,如果同NAME同LEVEL有多条,就要找最大的ID,然后再去关联数据表就可以了。
需要用到表变量和子查询。
查询时先找出LEVEL最大的记录,如果同NAME同LEVEL有多条,就要找最大的ID,然后再去关联数据表就可以了。
需要用到表变量和子查询。
#3
还是不大明白你说的意思,并不需要找最大的ID,
而是要找出每个name中level最大的那些记录行,如果一个name的同一个(最大的)level相同,则取时间最近的一个!
谁能给个sql语句示例啊??
而是要找出每个name中level最大的那些记录行,如果一个name的同一个(最大的)level相同,则取时间最近的一个!
谁能给个sql语句示例啊??
#4
--测试表及数据
create table #t (id int, name varchar(20),level int,date datetime)
insert into #t
select 1,'name1',1,'2005-6-8 15:39:20' union
select 2,'name2',3,'2005-6-7 15:39:20' union
select 4,'name1',4,'2005-6-5 15:39:20' union
select 6,'name3',2,'2005-6-9 15:39:20' union
select 7,'name3',2,'2005-6-8 15:45:20' union
select 8,'name4',4,'2005-6-9 15:45:20'
--处理过程,使用动态sql语句。或者由程序构建成这样的sql语句执行。
/*
select id=(select top 1 id from #t where name=a.name and level=max(a.level) order by date DESC)
,a.name,level=max(a.level),date=(select max(date) from #t where name=a.name and level=max(a.level))
from #t a
where a.name in('name1','name2','name3')
group by a.name
*/
declare @sql varchar(8000),@string varchar(200)
select @string='''name1'',''name2'',''name3'''
set @sql='select id=(select top 1 id from #t where name=a.name and level=max(a.level) order by date DESC)
,a.name,level=max(a.level),date=(select max(date) from #t where name=a.name and level=max(a.level))
from #t a
where a.name in('+@string+')
group by a.name'
exec(@sql)
/*
结果
id name level date
-------------------------------------------
4 name1 4 2005-06-05 15:39:20.000
2 name2 3 2005-06-07 15:39:20.000
6 name3 2 2005-06-09 15:39:20.000
*/
create table #t (id int, name varchar(20),level int,date datetime)
insert into #t
select 1,'name1',1,'2005-6-8 15:39:20' union
select 2,'name2',3,'2005-6-7 15:39:20' union
select 4,'name1',4,'2005-6-5 15:39:20' union
select 6,'name3',2,'2005-6-9 15:39:20' union
select 7,'name3',2,'2005-6-8 15:45:20' union
select 8,'name4',4,'2005-6-9 15:45:20'
--处理过程,使用动态sql语句。或者由程序构建成这样的sql语句执行。
/*
select id=(select top 1 id from #t where name=a.name and level=max(a.level) order by date DESC)
,a.name,level=max(a.level),date=(select max(date) from #t where name=a.name and level=max(a.level))
from #t a
where a.name in('name1','name2','name3')
group by a.name
*/
declare @sql varchar(8000),@string varchar(200)
select @string='''name1'',''name2'',''name3'''
set @sql='select id=(select top 1 id from #t where name=a.name and level=max(a.level) order by date DESC)
,a.name,level=max(a.level),date=(select max(date) from #t where name=a.name and level=max(a.level))
from #t a
where a.name in('+@string+')
group by a.name'
exec(@sql)
/*
结果
id name level date
-------------------------------------------
4 name1 4 2005-06-05 15:39:20.000
2 name2 3 2005-06-07 15:39:20.000
6 name3 2 2005-06-09 15:39:20.000
*/
#5
执行有错误啊
#6
create table #t (id int, name varchar(20),level int,date datetime)
insert into #t
select 1,'name1',1,'2005-6-8 15:39:20' union
select 2,'name2',3,'2005-6-7 15:39:20' union
select 4,'name1',4,'2005-6-5 15:39:20' union
select 6,'name3',2,'2005-6-9 15:39:20' union
select 7,'name3',2,'2005-6-8 15:45:20' union
select 8,'name4',4,'2005-6-9 15:45:20'
select *
from #t a
where a.LEVEL = (select max(LEVEL) from #t where NAME=a.NAME)
And A.DATE = (select max(DATE) from #t where NAME=a.NAME)
Drop Table #t
#7
Select *
From (select *
from #t a
where a.LEVEL = (select max(LEVEL) from #t where NAME=a.NAME)) B
Where B.DATE = (select max(DATE) from (select *
from #t a
where a.LEVEL = (select max(LEVEL) from #t where NAME=a.NAME)) C
where C.NAME=B.NAME)
Order By Id
From (select *
from #t a
where a.LEVEL = (select max(LEVEL) from #t where NAME=a.NAME)) B
Where B.DATE = (select max(DATE) from (select *
from #t a
where a.LEVEL = (select max(LEVEL) from #t where NAME=a.NAME)) C
where C.NAME=B.NAME)
Order By Id
#8
jzdmyjzd(晓明) ,谢谢,你的sql经过测试是正确的。
我已经通过转换并添加一些其他条件后使用了,再次感谢。
BTW:你的名字和我的是一样的。:)
我已经通过转换并添加一些其他条件后使用了,再次感谢。
BTW:你的名字和我的是一样的。:)
#1
还有一个条件:
3》 结果中的其他详细字段值为表中符合条件的level最大值、并且时间最近一条数据的所在行
3》 结果中的其他详细字段值为表中符合条件的level最大值、并且时间最近一条数据的所在行
#2
'name1','name2','name3'生成一个表变量,然后用这个表变量与数据表关联查询。
查询时先找出LEVEL最大的记录,如果同NAME同LEVEL有多条,就要找最大的ID,然后再去关联数据表就可以了。
需要用到表变量和子查询。
查询时先找出LEVEL最大的记录,如果同NAME同LEVEL有多条,就要找最大的ID,然后再去关联数据表就可以了。
需要用到表变量和子查询。
#3
还是不大明白你说的意思,并不需要找最大的ID,
而是要找出每个name中level最大的那些记录行,如果一个name的同一个(最大的)level相同,则取时间最近的一个!
谁能给个sql语句示例啊??
而是要找出每个name中level最大的那些记录行,如果一个name的同一个(最大的)level相同,则取时间最近的一个!
谁能给个sql语句示例啊??
#4
--测试表及数据
create table #t (id int, name varchar(20),level int,date datetime)
insert into #t
select 1,'name1',1,'2005-6-8 15:39:20' union
select 2,'name2',3,'2005-6-7 15:39:20' union
select 4,'name1',4,'2005-6-5 15:39:20' union
select 6,'name3',2,'2005-6-9 15:39:20' union
select 7,'name3',2,'2005-6-8 15:45:20' union
select 8,'name4',4,'2005-6-9 15:45:20'
--处理过程,使用动态sql语句。或者由程序构建成这样的sql语句执行。
/*
select id=(select top 1 id from #t where name=a.name and level=max(a.level) order by date DESC)
,a.name,level=max(a.level),date=(select max(date) from #t where name=a.name and level=max(a.level))
from #t a
where a.name in('name1','name2','name3')
group by a.name
*/
declare @sql varchar(8000),@string varchar(200)
select @string='''name1'',''name2'',''name3'''
set @sql='select id=(select top 1 id from #t where name=a.name and level=max(a.level) order by date DESC)
,a.name,level=max(a.level),date=(select max(date) from #t where name=a.name and level=max(a.level))
from #t a
where a.name in('+@string+')
group by a.name'
exec(@sql)
/*
结果
id name level date
-------------------------------------------
4 name1 4 2005-06-05 15:39:20.000
2 name2 3 2005-06-07 15:39:20.000
6 name3 2 2005-06-09 15:39:20.000
*/
create table #t (id int, name varchar(20),level int,date datetime)
insert into #t
select 1,'name1',1,'2005-6-8 15:39:20' union
select 2,'name2',3,'2005-6-7 15:39:20' union
select 4,'name1',4,'2005-6-5 15:39:20' union
select 6,'name3',2,'2005-6-9 15:39:20' union
select 7,'name3',2,'2005-6-8 15:45:20' union
select 8,'name4',4,'2005-6-9 15:45:20'
--处理过程,使用动态sql语句。或者由程序构建成这样的sql语句执行。
/*
select id=(select top 1 id from #t where name=a.name and level=max(a.level) order by date DESC)
,a.name,level=max(a.level),date=(select max(date) from #t where name=a.name and level=max(a.level))
from #t a
where a.name in('name1','name2','name3')
group by a.name
*/
declare @sql varchar(8000),@string varchar(200)
select @string='''name1'',''name2'',''name3'''
set @sql='select id=(select top 1 id from #t where name=a.name and level=max(a.level) order by date DESC)
,a.name,level=max(a.level),date=(select max(date) from #t where name=a.name and level=max(a.level))
from #t a
where a.name in('+@string+')
group by a.name'
exec(@sql)
/*
结果
id name level date
-------------------------------------------
4 name1 4 2005-06-05 15:39:20.000
2 name2 3 2005-06-07 15:39:20.000
6 name3 2 2005-06-09 15:39:20.000
*/
#5
执行有错误啊
#6
create table #t (id int, name varchar(20),level int,date datetime)
insert into #t
select 1,'name1',1,'2005-6-8 15:39:20' union
select 2,'name2',3,'2005-6-7 15:39:20' union
select 4,'name1',4,'2005-6-5 15:39:20' union
select 6,'name3',2,'2005-6-9 15:39:20' union
select 7,'name3',2,'2005-6-8 15:45:20' union
select 8,'name4',4,'2005-6-9 15:45:20'
select *
from #t a
where a.LEVEL = (select max(LEVEL) from #t where NAME=a.NAME)
And A.DATE = (select max(DATE) from #t where NAME=a.NAME)
Drop Table #t
#7
Select *
From (select *
from #t a
where a.LEVEL = (select max(LEVEL) from #t where NAME=a.NAME)) B
Where B.DATE = (select max(DATE) from (select *
from #t a
where a.LEVEL = (select max(LEVEL) from #t where NAME=a.NAME)) C
where C.NAME=B.NAME)
Order By Id
From (select *
from #t a
where a.LEVEL = (select max(LEVEL) from #t where NAME=a.NAME)) B
Where B.DATE = (select max(DATE) from (select *
from #t a
where a.LEVEL = (select max(LEVEL) from #t where NAME=a.NAME)) C
where C.NAME=B.NAME)
Order By Id
#8
jzdmyjzd(晓明) ,谢谢,你的sql经过测试是正确的。
我已经通过转换并添加一些其他条件后使用了,再次感谢。
BTW:你的名字和我的是一样的。:)
我已经通过转换并添加一些其他条件后使用了,再次感谢。
BTW:你的名字和我的是一样的。:)