Выбор максимальной записи для каждого пользователя
Кажется, если это будет довольно просто, но я спотыкаюсь найти решение, которое работает для меня.
У меня есть таблица 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 для каждого пользователя, а не самые последние даты.
Ответы
Ответ 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
Это обрабатывает случай нескольких контрактов для одного и того же члена., что не может быть проблемой в этих данных.