2011-09-14 16 views
8

MS Accessの使用。私はタイトルがあいまいで残念です - 私はちょうどこれがどのタイプの問題であるかを正確には知らないので、私はそれを解決するために2つのテーブルまたはクエリを結合する必要があることを知っています。SQLへのアクセスの質問

Person | Org | JoinDate 
----------------------- 
123 | abc | 3/2/2011 
456 | abc | 4/23/1925 
123 | def | 5/12/2011 

は私も持っている:

私は(あなただけ一度に一つ組織のメンバーにすることができます)は、特定の日に参加した団体(ID別)各人物を示す OrgHistoryテーブルを持っています Activities表:

Person | Activity | ActivityDate 
-------------------------------- 
123 | eat  | 3/23/2011 
123 | sleep | 6/25/2011 
456 | walk  | 7/20/1985 

私は、人が活動の日ののメンバーだった組織、Activitiesに各レコードについて、知りたいです。私はJoinDateの値を範囲のセットに変換し、適切な間隔にActivityDateをマッチさせることを含むかもしれないと思っていますが、私はこのケースでクエリをどのように設計するか少し混乱します。個々の値をある範囲に?

既知の量のバケットに複数のJoinDateの値を保持しようとしていないため、partition()が機能しないとは思わない。私はこれを約束することはできません

+0

を:あなたベーステーブルに新しいLeaveDateカラムを追加し、同じ人物のためにピリオドが重複しないようにシーケンスキーを追加します(ヒント: 'CHECK'制約が必要です)。** ** once **(@ Banjoe'sクエリはこれに有望です)。 – onedaywhen

+0

+1 @onedaywhen - アクティブ/非アクティブブール値の代わりに休暇日を使用する場合。多くの人々は、会員を見つけるために歴史的に戻る必要はないと考えています。 – JeffO

答えて

5

は、最も効率的な方法ですが、それはあなたが提供するテストデータとアクセスして動作します。私はあなた `OrgHistory`テーブルは` LeaveDate`属性が欠落している同意

SELECT a.person, a.activity, 
     (
     SELECT TOP 1 org 
      FROM orghistory AS o 
     WHERE o.person = a.person 
       AND o.joindate <= a.activitydate 
     ORDER 
      BY o.joindate DESC 
     ) AS Org 
    FROM activities AS a; 
+0

ありがとう! <=活動日のトップメンバーシップの日付を取ることについての良いアイデアです。 – sigil