查点顺序?

时间:2013-10-02 05:30:40

标签: sql-server tsql

我有这个简单的(测试)表:

enter image description here

  • namee是工作人员姓名

  • salaryStep是代表新的加薪日期的日期。

我需要找到我目前在哪一步。 (基于给定日期)

例如,如果给定日期为2013 nov 11,那么我应该在id=2

所以逻辑非常简单:

1)通过salarystep DESC

对表格进行排序

2)从那里开始,取第一项小于@now

的项目

但是当我通过

实现它时
DECLARE @now date = '20131111'
SELECT    TOP 1  salaryStep
FROM   (
           SELECT TOP 100 PERCENT
                  salaryStep
           FROM   [aaa].[dbo].[Table_1]
           ORDER BY
                  salaryStep DESC
       )         a
WHERE  a.salaryStep<=@now

答案是:

2013-10-02 - 不正确

所以我问:

问题#1

似乎虽然我在内部选择order by salaryStep DESC中指定了,但枚举确实从该顺序开始。那是为什么?

问题#2

这样做的正确方法是什么?

必填结果:

2013-10-15(或id = 2,没关系)

1 个答案:

答案 0 :(得分:1)

这应该足够了:

DECLARE @now date = '20131111'
SELECT    TOP 1  salaryStep
FROM [aaa].[dbo].[Table_1]
WHERE  salaryStep<=@now
ORDER BY salaryStep DESC

问题#1的答案是,您的内部查询的顺序并不重要,重要的是外部查询顺序,因为TOP 1会受到影响

一个简单的测试:

create table test(a int)
insert into test values (1)
insert into test values (2)
insert into test values (3)

select top 1 * from
(select top 100 percent a from test order by a desc) x

返回1(无论使用TOP 100 PERCENT时的内部顺序如何)。