feiqiu2000 2022-08-07 18:49 采纳率: 100%
浏览 25
已结题

SQLSERVER2008 在求最小值min时,TOP子句不起作用,求帮助

问题遇到的现象和发生背景

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取的值是错的

  • 写回答

3条回答 默认 最新

  • chuifengde 2022-08-07 20:17
    关注

    单纯top 5与子查询时的top 5有可能执行计划 不一样,所以为了确保数据要准确可以在 top 5的最后面加上 order by idt desc

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 8月15日
  • 已采纳回答 8月7日
  • 创建了问题 8月7日

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。