数据库:MSSQL
表:
ICNO(卡号) DATE(日期) BALANCE(余额) ICLINENO(卡流水号)
0001 2005/10/01 100 10
0001 2005/10/02 99 11
0001 2005/10/02 98 12
0002 2005/10/01 60 30
0003 2005/10/01 60 30
0004 2005/10/02 70 40
0001 2005/10/03 97 13
0002 2005/10/02 59 31
0001 2005/10/04 96 14
0002 2005/10/02 58 32
0003 2005/10/02 59 31
0002 2005/10/03 57 33
ICNO(卡号) DATE(日期) BALANCE(余额) ICLINENO(卡流水号)
0001 2005/10/01 100 10
0001 2005/10/02 99 11
0001 2005/10/02 98 12
0002 2005/10/01 60 30
0003 2005/10/01 60 30
0004 2005/10/02 70 40
0001 2005/10/03 97 13
0002 2005/10/02 59 31
0001 2005/10/04 96 14
0002 2005/10/02 58 32
0003 2005/10/02 59 31
0002 2005/10/03 57 33
要求结果:
ICNO(卡号) DATE(日期) BALANCE(余额) ICLINENO(卡流水号)
0001 2005/10/02 98 12
0001 2005/10/03 97 13
0001 2005/10/04 96 14
0002 2005/10/02 59 31
0002 2005/10/02 58 32
0002 2005/10/03 57 33
0003 2005/10/01 60 30
0003 2005/10/02 59 31
0004 2005/10/02 70 40
想要每一个卡号(ICNO)的最后三次记录,记录多于三次就取最后三次记录
ICNO(卡号) DATE(日期) BALANCE(余额) ICLINENO(卡流水号)
0001 2005/10/02 98 12
0001 2005/10/03 97 13
0001 2005/10/04 96 14
0002 2005/10/02 59 31
0002 2005/10/02 58 32
0002 2005/10/03 57 33
0003 2005/10/01 60 30
0003 2005/10/02 59 31
0004 2005/10/02 70 40
想要每一个卡号(ICNO)的最后三次记录,记录多于三次就取最后三次记录
-----------------------------------
create table #tab (ICNO varchar(8) , DATE datetime, BALANCE float ,ICLINENO int )
go
insert into #tab values('0001', '2005/10/01', 100, 10)
insert into #tab values('0001', '2005/10/02', 99, 11)
insert into #tab values('0001', '2005/10/02', 98, 12)
insert into #tab values('0002', '2005/10/01', 60, 30)
insert into #tab values('0003', '2005/10/01', 60, 30)
insert into #tab values('0004', '2005/10/02', 70, 40)
insert into #tab values('0001', '2005/10/03', 97, 13)
insert into #tab values('0002', '2005/10/02', 59, 31)
insert into #tab values('0001', '2005/10/04', 96, 14)
insert into #tab values('0002', '2005/10/02', 58, 32)
insert into #tab values('0003', '2005/10/02', 59, 31)
insert into #tab values('0002', '2005/10/03', 57, 33)
go
go
insert into #tab values('0001', '2005/10/01', 100, 10)
insert into #tab values('0001', '2005/10/02', 99, 11)
insert into #tab values('0001', '2005/10/02', 98, 12)
insert into #tab values('0002', '2005/10/01', 60, 30)
insert into #tab values('0003', '2005/10/01', 60, 30)
insert into #tab values('0004', '2005/10/02', 70, 40)
insert into #tab values('0001', '2005/10/03', 97, 13)
insert into #tab values('0002', '2005/10/02', 59, 31)
insert into #tab values('0001', '2005/10/04', 96, 14)
insert into #tab values('0002', '2005/10/02', 58, 32)
insert into #tab values('0003', '2005/10/02', 59, 31)
insert into #tab values('0002', '2005/10/03', 57, 33)
go
select * from #tab t
where (select count(DATE) from #tab where ICNO=t.ICNO and ICLINENO>=t.ICLINENO)<=3
order by t.ICNO,t.DATE
-----------------------------------
where (select count(DATE) from #tab where ICNO=t.ICNO and ICLINENO>=t.ICLINENO)<=3
order by t.ICNO,t.DATE
-----------------------------------
注:本来感觉这问题和我前几天做的那个“取前几名的例子”问题一样呢。后来发现有ICLINENO(卡流水号)这个字段,这样出现重复日期的问题就可以处理了,解决了Sybase下无TOP的问题。看来对于某些需求,加个唯一(或者在组内唯一)的字段还是很有必要的