sql - 寻找更好的方法来获得每组前 1 名

标签 sql sql-server sql-server-2005

我正在尝试查找每个 id 早于 1/1/2013

的最新 value
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')

以下内容为我提供了解决方案,但我知道我这样做是错误的。

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

由于没有任何早于 2013 年 1 月 1 日的记录,ID 2 未返回。

完成我正在尝试做的事情的正确方法是什么?

最佳答案

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

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;

SQL Fiddle with Demo

关于sql - 寻找更好的方法来获得每组前 1 名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16423850/

相关文章:

mysql - 按项目和周运行总计

sql-server - 为什么将字符串转换为 SQL Server XML 数据类型时回车符消失?

sql - 选择前 1000 个,但知道有多少行?

sql - 查找顺序值的有效方法

sql - postgreSQL:插入多行,其中只有一列值发生变化

PHP无法连接mysql数据库

c# - 停止 SQL Server - 使用 C#

sql - R:将完整数据库从 SQL Server 复制/克隆到本地

c# - 如何确保 Linq to Sql 不会覆盖或违反不可为 null 的数据库默认值?

sql - 将 Year+WeekOfYear+DayOfWeek 转换为日期