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 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?