2017-01-27 2 views
0

У меня есть две таблицы в SQL Server 2008 R2. Одна таблица представляет собой таблицу поиска, содержащую описание службы, а другая таблица содержит историю обслуживания для клиента. Мне нужно написать запрос, чтобы перечислить все типы услуг и когда они были в последний раз использованы. Вот поля в двух таблицах, которые я должен работать с:Запросить две таблицы, чтобы получить список с самой последней датой?

Table1: Code_Service 
ULink 
Description 

Table2: Service_History 
ServiceTypeULink 
RecordUpdateDateTime 

Table1 data: 
ULink          Description 
037dc811-4d56-XXXX-XXXX-XXXXXXXXXc   Dental 
5589e876-9c48-XXXX-XXXX-XXXXXXXXXd   Surgical Procedure 
177rt522-2s96-XXXX-XXXX-XXXXXXXXXa   Specialty 

Table2 data: 
ServiceTypeULink       RecordUpdateDateTime 
037dc811-4d56-XXXX-XXXX-XXXXXXXXXc   10/11/2014 12:38:02 PM 
5589e876-9c48-XXXX-XXXX-XXXXXXXXXd   4/21/2013 10:45:28 AM 
177rt522-2s96-XXXX-XXXX-XXXXXXXXXa   11/22/2015 11:37:35 AM 

Поля ULINK и ServiceTypeULink то, что связывает их. Поэтому мне нужно запросить все «Code_Service.Description», используемые в Service_History, которые имеют самую последнюю «RecordUpdateDateTime». Я написал следующий запрос, и, кажется, работает, но не уверен, что это правильно (или лучше/быстрее) способ сделать это, учитывая, что я на SQL Server 2008.

SELECT 
    Code_Service.Description 
,MAX(Service_History.RecordUpdatedDateTime) AS DateLastUsed 
FROM dbo.Service_History 
LEFT OUTER JOIN dbo.Code_Service 
    ON Service_History.ServiceTypeULink = Code_Service.ULink 
GROUP BY Code_Service.Description 
ORDER BY DateLastUsed DESC 

Спасибо

ответ

1

Это будет сделано, но если вам нужна дополнительная информация с любой из таблиц, вы также можете использовать:

with MyCTE as 
(
SELECT 
    Code_Service.Description 
,Service_History.RecordUpdatedDateTime 
-- add any other columns needed in here -- 
,row_number() over (partition by ServiceTypeULink 
        order by RecordUpdatedDateTime desc) as R_ORD 
FROM dbo.Service_History 
LEFT OUTER JOIN dbo.Code_Service 
    ON Service_History.ServiceTypeULink = Code_Service.ULink 
) 
select * 
from MyCTE 
where R_ORD = 1 
+0

Спасибо большое! Мне нравится, как вы использовали Common Table Expression (CTE), а затем запросили на том, где row_number = 1. Узнали что-то сегодня. Еще раз спасибо. – DataCrypt