检索每个客户的最新记录

Lyn*_*ler 2 sql t-sql sql-server sql-server-2005 greatest-n-per-group

我有这些数据:

ID   NAME   DATE
3    JOHN   2011-08-08
2    YOKO   2010-07-07
1    JOHN   2009-06-06
Run Code Online (Sandbox Code Playgroud)

代码(适用于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')
Run Code Online (Sandbox Code Playgroud)

我想为每个NAME获取具有最新DATE的ID.像这样:

3    JOHN   2011-08-08
2    YOKO   2010-07-07
Run Code Online (Sandbox Code Playgroud)

实现这一目标最优雅的方式是什么?

Aar*_*and 14

;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;
Run Code Online (Sandbox Code Playgroud)

尽量避免使用保留字(和模糊的列名)[DATE]...

  • @IDevlop - 我认为速度将更多地取决于您的索引而不是查询.我认为这个和其他版本之间的差异应该是最小的性能. (2认同)