получить самую последнюю запись для каждого клиента - PullRequest
2 голосов
/ 19 сентября 2011

У меня есть эти данные:

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')

Я хочу получить для каждого ИМЕНИ идентификатор, который имеет самую последнюю ДАТУ. Как это:

3    JOHN   2011-08-08
2    YOKO   2010-07-07

Какой самый элегантный способ сделать это?

Ответы [ 3 ]

14 голосов
/ 19 сентября 2011
;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] ...

4 голосов
/ 19 сентября 2011
SELECT <fields>
FROM SourceTable st
INNER JOIN (SELECT name, MAX(Datefield) as Datefield
            FROM SourceTable
            GROUP BY name) x
    ON x.Name = st.name
    AND x.datefield = st.datefield
0 голосов
/ 16 ноября 2018

ниже возможное решение:

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
...