web-dev-qa-db-ja.com

各ユーザーの最大レコードの選択

これはかなり単純なはずですが、私は自分に合った解決策を見つけようとしています。

次の(簡略化された)構造を持つ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

サブクエリを使用して、指定されたユーザーの最大contractIDを選択するだけなので、ユーザーごとにこれを行うのは非常に簡単です。私はSQLサーバーを使用しているので、そのフレーバーで特別な方法があれば、私はそれを使用することにオープンです。個人的には、エンジンにとらわれない何かが欲しいです。

しかし、すべてのユーザーの目標を達成するクエリを作成するにはどうすればよいですか?

編集:また、最新の日付ではなく、各ユーザーの最大contractID値を探していることを追加する必要があります。

31
Scott

このソリューションでは、ContractIdフィールドの一意性を使用します。

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

オンラインで動作することを確認してください: sqlfiddle

37
Mark Byers

これを行う最も安全な方法は、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

これは、同じメンバーの複数の契約のケースを処理します。 。 。このデータでは実際には問題にならない場合があります。

15
Gordon Linoff