Подтвердить что ты не робот

Выбор максимальной записи для каждого пользователя

Кажется, если это будет довольно просто, но я спотыкаюсь найти решение, которое работает для меня.

У меня есть таблица member_contracts, которая имеет следующую (упрощенную) структуру.

MemberID | ContractID   | StartDate | End Date |
------------------------------------------------
1          1              2/1/2002    2/1/2003
2          2              3/1/2002    3/1/2003
3          3              4/1/2002    4/1/2003
1          4              2/1/2002    2/1/2004
2          5              3/1/2003    2/1/2004
3          6              4/1/2003    2/1/2004

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

MemberID | ContractID   | StartDate | End Date |
------------------------------------------------
1          4              2/1/2002    2/1/2004
2          5              3/1/2003    2/1/2004
3          6              4/1/2003    2/1/2004

Выполнение этого для каждого пользователя чрезвычайно просто, так как я могу просто использовать подзапрос, чтобы выбрать max contractID для указанного пользователя. Я использую SQL-сервер, поэтому, если есть особый способ сделать это с этим вкусом, я открыт для его использования. Лично мне хотелось бы что-то, что было агностиком.

Но как я могу написать запрос, который бы достиг цели для всех пользователей?

EDIT: Я также должен добавить, что я ищу максимальное значение contractID для каждого пользователя, а не самые последние даты.

4b9b3361

Ответ 1

Это решение использует уникальность поля ContractId:

SELECT MemberID, ContractID, StartDate, EndDate
FROM member_contracts 
WHERE ContractId IN (
    SELECT MAX(ContractId)
    FROM member_contracts 
    GROUP BY MemberId
)

Посмотрите, как он работает в Интернете: sqlfiddle

Ответ 2

Самый безопасный способ сделать это - row_number

select MemberId, ContractId, StartDate, EndDate
from (select mc.*,
             row_number() over (partition by MemberId order by contractId desc) seqnum
      from Member_Contracts mc
     ) mc
where seqnum = 1

Это обрабатывает случай нескольких контрактов для одного и того же члена., что не может быть проблемой в этих данных.