问题遇到的现象和发生背景
sqlserver2008,打算使用TOP子句限制行数,然后对这几行数据求最小值
创建数据表
CREATE TABLE [dbo].[t1](
[tid] [dbo].[int0] NOT NULL,
[idt] [dbo].[int0] NOT NULL,
CONSTRAINT [PK_t1] PRIMARY KEY CLUSTERED
(
[tid] ASC,
[idt] DESC
)
填充数据
insert into t1 (tid,idt) values (1,20030105)
insert into t1 (tid,idt) values (1,20020118)
insert into t1 (tid,idt) values (1,20020117)
insert into t1 (tid,idt) values (2,20020216)
insert into t1 (tid,idt) values (1,20020116)
insert into t1 (tid,idt) values (1,20020115)
insert into t1 (tid,idt) values (2,19990820)
insert into t1 (tid,idt) values (1,20020114)
insert into t1 (tid,idt) values (1,20010616)
insert into t1 (tid,idt) values (1,20000104)
表格内容:
tid idt
1 20030105
1 20020118
1 20020117
2 20020216
1 20020116
1 20020115
2 19990820
1 20020114
1 20010616
1 20000104
代码:
select top 5 t1.idt from t1 where t1.tid = 1 and t1.idt < 20020121
返回值,前5行的值
20020118
20020117
20020116
20020115
20020114
计划获得的值应该是20020114
使用以下代码:
select MIN(tv.idt) as dt from (select top 5 t1.idt from t1 where t1.tid = 1 and t1.idt < 20020121) as tv
返回结果:
20000104
这个结果就是不对的,这是整列的最小值,行数的限制没有起作用。
又试图验证取了几行数据,加了一个数据项:
select MIN(tv.idt) as dt,COUNT(*) as dc from (select top 5 t1.idt from t1 where t1.tid = 1 and t1.idt < 20020121) as tv
返回结果:
dt dc
20020114 5
这次的结果又正确了。
问题是我用在子查询里,对每一行数据都要计算小于本行关键值的5行数据计算值(比如最大值,最小值,平均值之类的),只能返回一个结果,这次两个结果虽然正确也不能用,即使再加一层查询语句也没用,又恢复错误的值了。
代码:
select dt from (select MIN(tv.idt) as dt,COUNT(*) as dc from (select top 5 t1.idt from t1 where t1.tid = 1 and t1.idt < 20020121) as tv ) as tv1
很奇怪,不知道怎么能达成目的,麻烦指点,想了好多办法都不行,谢谢。
还有这5行数据还不是单纯的表格顺序,需要符合条件的5行数据。换用max,值又是正确的,只有min取的值是错的