39

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

次の(簡略化された)構造を持つ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値を探していることも追加する必要があります。

4

2 に答える 2

49

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

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

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

于 2012-08-30T18:53:55.910 に答える
21

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

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

于 2012-08-30T18:57:42.807 に答える