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