Выбор записей по группам, каждая из которых имеет максимальную дату соответственно - PullRequest
0 голосов
/ 29 марта 2012

У меня есть три таблицы проблем и запрос, который генерирует следующий вывод из них, где каждое поле предваряется буквой, представляющей исходную таблицу для демонстрационных целей.Вместо этого мне хотелось бы получить отчет, содержащий только самые последние данные, т.е. я хочу получить только строку, возвращенную с MAX (EntryDate), но я не могу понять, как этого добиться.Я пробовал HAVING, агрегаты и т. Д., Но безуспешно.Либо мой подход неверен, либо я что-то упускаю синтаксически.

s.ID    r.FirstID    m.ID   m.PartNum     m.Revision     r.EntryDate
26      42           13     NULL          A              2012-03-25 15:32:00
26      42           17     820044444     B              2012-03-27 09:48:00
26      42           14     820056789     C              2012-03-28 12:19:00

Желаемый результат:

s.ID    r.FirstID    m.ID   m.PartNum     m.Revision     r.EntryDate
26      42           14     820056789     C              2012-03-28 12:19:00

Для небольшого дополнительного фона r.FirstID представляет группу записейвсе они связаны друг с другом, поэтому для каждой группировки Я хочу вернуть только запись с самыми последними данными.

Вот мой запрос, который у меня есть:

select s.ID,r.FirstID,m.ID,m.PartNum,m.Revision,r.EntryDate from StatusLog s
    left join (select FirstID,PartInfoID from Request where PartInfoID is not null group by FirstID,PartInfoID) r on s.FirstID= r.FirstID
    --required filtering here? Or move this extra join to the inner query?
    left join PartInfo m on r.PartInfoID = m.ID

Я использую SQL Server для своей СУБД.

1 Ответ

1 голос
/ 29 марта 2012

Самый простой способ - использовать ROW_NUMBER() (а я использую CTE для простоты). Дайте мне знать, если вам нужно, чтобы я объяснил, что здесь происходит:)

WITH myCTE
AS
(
    SELECT s.ID AS sID, r.FirstID, m.ID AS mID, m.PartNum, m.Revision, 
        r.EntryDate, 
        ROW_NUMBER() OVER 
            (PARTITION BY r.FirstID ORDER BY r.EntryDate DESC) AS RowNumber
    FROM StatusLog s
        LEFT JOIN 
        (
            SELECT FirstID, PartInfoID 
            FROM Request 
            WHERE PartInfoID IS NOT NULL 
            GROUP BY FirstID,PartInfoID
        ) AS r 
            ON s.FirstID= r.FirstID
        LEFT JOIN PartInfo m 
            ON r.PartInfoID = m.ID
)
SELECT sID,FirstID,mID,PartNum,Revision,EntryDate
FROM myCTE 
WHERE RowNumber = 1;
...