select * from 表 a
where 日期=(select top 1 日期 from 表 where 编号=a.编号 order by 日期 desc)
--或:
select a.* from 表 a,(select 编号,日期=max(日期) from 表 group by 编号)b
where a.编号=b.编号 and a.日期=b.日期
--或:
select * from 表 a
where not exists(
select * from 表 where 编号=a.编号 and 日期>a.日期)
如何在查询的时候添加一个虚拟的序号字段
摘txlicenhe (马可) :
1: 自增列 类型为:int identity(1,1) 当然也可以是bigint,smallint
eg: create table tbName(id int identity(1,1),description varchar(20))
或在用企业管理器设计表字段时,将字段设为int,将标识设为是,其它用默认即可
2: 查询时加序号:
a:没有主键的情形:
Select identity(int,1,1) as iid,* into #tmp from TableName
Select * from #tmp
Drop table #tmp
b:有主键的情形:
Select (Select sum(1) from TableName where KeyField <= a.KeyField) as iid,* from TableName a
3:生成自增序列号的表
eg: 生成一列0-30的数
Select top 30 (select sum(1) from sysobjects where name<= a.name)-1 as id from sysobjects a
当然,可能sysobjects 中没有这么多条记录,比如只有100条,我需生成1-800的序列号
如下处理:
Select (Select sum(1) from (Select top 800 a.name as name1,b.name as name2 from sysobjects a ,sysobjects b) cc where name1<= dd.name1 and name2 <= dd.name2 ) from
(Select top 800 a.name as name1,b.name as name2 from sysobjects a ,sysobjects b) dd
应用举例
eg1:
create table t(日期 char(8),请假人数 int)
insert t select '20031001',3
Union all select '20031003',2
Union all select '20031004',1
Union all select '30031031',5
要列出2003年10月每一天的请假人数,若没有,以0表示。
Select convert(char(8),dateadd(day,id,'20031001'),112),IsNull(t.请假人数,0) from
(Select top 31 (select sum(1) from sysobjects where name<= a.name)-1 as id from sysobjects a) bb
left join t on convert(char(8),dateadd(day,id,'20031001'),112) = t.日期
eg2: 生成随机考勤打卡资料:
declare @r int
--得到要处理的记录数
set @r=900
--创建得到随机时间的临时表
create table #tb(id int identity(1,1),dt1 datetime,dt2 datetime,dt3 datetime,dt4 datetime,dt5 datetime,dt6 datetime)
--生成随机时间
declare @sql varchar(8000)
set @sql='insert into #tb(dt1,dt2,dt3,dt4,dt5,dt6) select top '+cast(@r as varchar)+'
dateadd(ss,rand(a.id)*1800,''07:30''),
dateadd(ss,rand(a.id+1)*400,''11:30''),
dateadd(ss,rand(a.id+2)*1600,''13:00''),
dateadd(ss,rand(a.id+3)*300,''17:30''),
dateadd(ss,rand(a.id+4)*800,''17:45''),
dateadd(ss,rand(a.id+5)*250,''20:00'')
from(select top 100 id from sysobjects) a,
(select top 9 id from sysobjects) b
order by newid()
exec(@sql)
当然,如果将07:30 11:30 ...这些时间改成排班时间就更好了。