Sql 检索每个客户的最新记录

Sql 检索每个客户的最新记录,sql,sql-server,sql-server-2005,tsql,greatest-n-per-group,Sql,Sql Server,Sql Server 2005,Tsql,Greatest N Per Group,我有以下数据: ID NAME DATE 3 JOHN 2011-08-08 2 YOKO 2010-07-07 1 JOHN 2009-06-06 SQL Server 2005的代码: DECLARE @TESTABLE TABLE (id int, name char(4), date smalldatetime) INSERT INTO @TESTABLE VALUES (3, 'JOHN', '2011-08-08') INSERT INTO

我有以下数据:

ID   NAME   DATE
3    JOHN   2011-08-08
2    YOKO   2010-07-07
1    JOHN   2009-06-06
SQL Server 2005的代码:

DECLARE @TESTABLE TABLE (id int, name char(4), date smalldatetime) 
INSERT INTO @TESTABLE VALUES (3, 'JOHN', '2011-08-08')
INSERT INTO @TESTABLE VALUES (2, 'YOKO', '2010-07-07')
INSERT INTO @TESTABLE VALUES (1, 'JOHN', '2009-06-06')
我想得到每个名字的最新日期的ID。像这样:

3    JOHN   2011-08-08
2    YOKO   2010-07-07
实现这一点最优雅的方式是什么

;WITH x AS 
(
    SELECT ID, NAME, [DATE], 
      rn = ROW_NUMBER() OVER 
      (PARTITION BY NAME ORDER BY [DATE] DESC)
    FROM @TESTABLE
)
SELECT ID, NAME, [DATE] FROM x WHERE rn = 1
  ORDER BY [DATE] DESC;

尽量避免使用保留字和模糊的列名,如[DATE]。

下面是一个可能的解决方案:

Select c.CustomerID, c.CustomerName, c.CustomerOrder, c.CustomerOrderDate, c.CustomerQty
from tblCustomer c
inner join (select c2.CustomerName, MAX(c2.CustomerOrderDate) as MaxDate from tblCustomer c2 group by c2.CustomerName) c2
on c.CustomerName = c2.CustomerName
where c.CustomerOrderDate = c2.MaxDate

这是优雅的。它比JOIN 2版本更高效吗?@IDevlop-我认为速度更多地取决于索引而不是查询。我认为这个版本和其他版本之间的差异应该是最小的性能方面。你可以比较执行计划,我怀疑你会发现很大的差异。您将希望在发生联系的情况下比较结果,但和/或定义在发生联系的情况下要执行的操作。
Select c.CustomerID, c.CustomerName, c.CustomerOrder, c.CustomerOrderDate, c.CustomerQty
from tblCustomer c
inner join (select c2.CustomerName, MAX(c2.CustomerOrderDate) as MaxDate from tblCustomer c2 group by c2.CustomerName) c2
on c.CustomerName = c2.CustomerName
where c.CustomerOrderDate = c2.MaxDate