Выберите самую последнюю запись в дочернем элементе - PullRequest
4 голосов
/ 06 марта 2011

У меня есть следующие таблицы / столбцы:

Parent:
  ParentID

Child:
  ChildID
  ParentID

SubChild:
  SubChildID
  ChildID
  Date

Parent имеет отношение 1 ко многим с Child

Child имеет отношение «1 ко многим» с SubChild

Для каждого Parent мне нужно получить SubChild с самым последним значением Date. Как я могу сделать это с помощью SQL. Я пытался использовать MAX(Date), но я не могу понять, как успешно присоединиться к Parent и Child.

Идеальный набор результатов будет содержать все Parent s, объединенные со всеми SubChild столбцами последней записи.

Примечание: использование MS SQL 2005 +

Ответы [ 4 ]

3 голосов
/ 06 марта 2011

Посмотрите на использование ROW_NUMBER

Что-то вроде

;WITH Vals AS (
        SELECT  p.ParentID,
                sc.SubChildID,
                ROW_NUMBER() OVER (PARTITION BY p.ParentID ORDER BY sc.[Date] DESC) RowID
        FROM    Parent p INNER JOIN
                Child c ON  p.ParentID = c.ParentID INNER JOIN
                SubChild sc ON  c.ChildID = sc.ChildID
)
SELECT  ParentID,
        SubChildID
FROM    Vals
WHERE   RowID = 1
2 голосов
/ 06 марта 2011

Для некоторых распределений данных этот подход может быть быстрее.

SELECT p.ParentID,
       sc.SubChildID,
       sc.Date
FROM   Parent p
       CROSS APPLY (SELECT TOP(1) s.SubChildID,
                                  s.Date
                    FROM   SubChild s
                           JOIN Child c
                             ON c.ChildID = s.ChildID
                    WHERE c.ParentID=p.ParentID
                    ORDER  BY s.Date DESC) sc  
0 голосов
/ 10 декабря 2013

Для простоты вы можете сделать дополнительный выбор.В моем тестировании эта производительность была такой же, как и в случае «перекрестного применения»:

select firstname, lastname, 
(Select top 1 Display from _notes where _notes.ParentId = c.Id order by createdon desc) as MostRecentNote
from _contacts c

Для 47k записей этот подход «дополнительного выбора» занимает около 4 секунд.Чтобы сделать это быстро, я добавил отсортированный индекс _Notes, который включал ParentId, CreatedOn (отсортированный по убыванию) и столбец Display был включен).Это уменьшает запрос менее чем на 1 секунду для 47k записей.

0 голосов
/ 06 марта 2011

Это можно сделать с помощью коррелированного подзапроса, но быстрее использовать функции ранжирования SQL Server 2005 . Пока ты знаешь, что делаешь, это так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...