我有这个简单的(测试)表:
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,没关系)
答案 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
时的内部顺序如何)。