找到一个更好的方法来做每组前1名

Sco*_*ain 3 sql sql-server sql-server-2005

我试图找到最近的valueid比年长1/1/2013

create table #foo
(
    id int,
    value money,
    entry_date datetime
)

insert into #foo values (1, 1.00, '1/1/2012')
insert into #foo values (1, 2.00, '2/1/2012')
insert into #foo values (1, 7.00, '1/1/2013')
insert into #foo values (2, 1.00, '1/1/2013')
insert into #foo values (2, 1.00, '2/1/2013')
insert into #foo values (3, 5.00, '3/1/2012')
Run Code Online (Sandbox Code Playgroud)

以下给出了解决方案,但我知道我这样做是错误的.

select id, value
from
(
    select id, value, row_number() over (partition by id order by entry_date desc) as ind
    from #foo
    where entry_date < '1/1/2013'
) a where ind = 1

--Results:
--id          value
------------- ---------------------
--1           2.00
--3           5.00
Run Code Online (Sandbox Code Playgroud)

由于没有任何早于1/1/2013的记录,因此未返回ID 2.

完成我想要做的事情的正确方法是什么?

Tar*_*ryn 6

您还可以使用子查询来获取结果:

select f1.id, f1.value
from #foo f1
inner join
(
  select id, max(entry_date) entry_date
  from #foo
  where entry_date < '1/1/2013'
  group by id
) f2
  on f1.id = f2.id
  and f1.entry_date = f2.entry_date;
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo