2014-09-15 4 views
1

У меня есть истории таблица (например, журнал), который регистрирует изменения в часть:Получить последнюю дату для каждой записи

TransactionID Part ID   Description  Last Updated 
1    1    Fixed O-ring  2006-03-14 20:00:04.700 
2    2    Replaced coil  2009-01-02 20:00:04.700 
3    1    Replaced coil  2009-01-02 20:00:04.700 
4    1    Replaced LED  2002-08-20 20:00:04.700  
5    2    Sealed leakage  2007-03-08 20:00:04.700 
6    3    Replace connector 2004-05-16 20:00:04.700 

У меня есть другая таблица, которая покажет, что каждая часть ID обозначает, но это не проблема, с которой я сейчас сталкиваюсь. Я должен написать запрос, который возвращает последнее обслуживание, выполняемое на каждой части. Так что в этом случае, мой ожидаемый результат будет:

TransactionID Part ID   Description  Last Updated 
2    2    Replaced coil  2009-01-02 20:00:04.700  
3    1    Replaced coil  2009-01-02 20:00:04.700 
6    3    Replace connector 2004-05-16 20:00:04.700 

Объяснения: Например, последнее обслуживание для части ID # 1 было завершено 2009-01-02 20: 00: 04.700 и так далее.

Я пробовал SELECT DISTINCT, но это не сработает, потому что в принципе все строки будут разными. Я совершенно не понимаю. И если я использую MAX(Last Updated), он вернет только одну строку всей таблицы.

Отредактировано: В любом случае, я НЕ разрешаю использовать динамический запрос.

+0

Какая версия SQL Server вы используете? Вы знакомы с функцией ROW_NUMBER()? –

+0

Я использую SQL Server 2008, и да, я слышал о Row_Number(), но не слишком хорошо знаком с ним –

ответ

3
SELECT TransactionID 
     ,PartID 
     ,[Description] 
     ,[Last Updated] 
FROM (
    SELECT TransactionID 
      ,PartID 
      ,[Description] 
      ,[Last Updated] 
      ,ROW_NUMBER() OVER (PARTITION BY [PartID] ORDER BY [Last Updated] DESC) RN 
    FROM TableName 
    )A 
WHERE A.RN = 1 

Или вы можете использовать CTE

;WITH CTE AS 
    (
    SELECT TransactionID 
      ,PartID 
      ,[Description] 
      ,[Last Updated] 
      ,ROW_NUMBER() OVER (PARTITION BY [PartID] ORDER BY [Last Updated] DESC) RN 
    FROM TableName 
) 
SELECT TransactionID 
     ,PartID 
     ,[Description] 
     ,[Last Updated] 
FROM CTE 
WHERE A.RN = 1 
+0

С CTE лучше. – MelgoV

+0

Да, у CTE есть свои преимущества, но для этого запроса он не имеет большого значения, либо выполнит эту работу. –

+0

Это именно то, что мне нужно. Спасибо! –

0
SELECT t.TransactionID, t.PartID, t.Description, t.LastUpdated 
FROM History t 
JOIN (SELECT PartID, MAX(TransactionID) 
FROM History 
GROUP BY PartID) t2 ON t.PartID = t2.PartID 
AND t.TransactionID = t2.TransactionID 

также будет работать.

+0

Вы имеете в виду MAX (последнее обновление)? –

+0

Ну, я обсуждал это :) Я сделал предположение, что TransactionID был уникальным и инкрементным (что может быть не так); Я всегда беспокоюсь, что даты не уникальны, и поэтому могут отбросить результаты. –

1
select 
    TransactionID, PartID, Description, LastUpdated 
from 
    History H 
where 
    LastUpdated = 
    (
     select 
      max(LastUpdated) 
     from 
      History 
     where 
      PartID = H.PartID 
    ) 
+0

Пожалуйста, дайте мне знать, если есть какие-либо проблемы с этим вопросом. –

+0

Ваш подзапрос не возвращает lastupdate для каждого TransactionID, ваш подзапрос просто возвращает максимальное значение lastupdate. – MelgoV

+0

@MelgoV. Мой подзапрос возвращает последнее обновление каждого идентификатора детали, что именно то, что задал OP. –

1

Вот как я хотел бы сделать это

;WITH CTE AS 
(
Select PartId, MAX(LASTUPDATED) as 'MAXX' from part group by PartId 
) 
Select TransActionId, p.PartId, Description, p.LASTUPDATED 
from Part p 
inner join CTE on p.LastUpdated = CTE.MAXX 
       and p.PartId = CTE.PartId   
+0

Но тогда, если есть какие-либо связи для MAX (LASTUPDATED), вы не получите нежелательное декартово соединение? –

Смежные вопросы