これはかなり単純なはずですが、私は自分に合った解決策を見つけようとしています。
次の(簡略化された)構造を持つ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値を探していることを追加する必要があります。
このソリューションでは、ContractIdフィールドの一意性を使用します。
SELECT MemberID, ContractID, StartDate, EndDate
FROM member_contracts
WHERE ContractId IN (
SELECT MAX(ContractId)
FROM member_contracts
GROUP BY MemberId
)
オンラインで動作することを確認してください: sqlfiddle
これを行う最も安全な方法は、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
これは、同じメンバーの複数の契約のケースを処理します。 。 。このデータでは実際には問題にならない場合があります。