2016-05-06 8 views
0

データベースに取り込まれている動物の最初のインスタンスをプルアップしようとしています。各動物はIDコードを持っています。MS Access 2007 SQL:IDが複数の日付に繰り返されるときの日付/ IDコンボの最初のインスタンスを選択してください

現在、各IDコードに関連付けられている最小の日付を使用しています。これは、同じ日に2回捕獲された2匹の動物を返すことを除いて大部分の場合にうまく機能する(AMセッション中に1回、PMセッション中に1回)。私のクエリは、その日に両方のキャプチャを返します。私は最初のものだけを必要とします。しかし、時には動物が午後に最初に捕まえられたので、私はPMキャプチャを除外することはできません。

現在、日付とAM/PMフィールドはアンケートIDによってキャプチャテーブルにリンクされているアンケートテーブルに保存されています。 8Jul2000のAM調査は、PM調査とは異なる調査IDを持っています。アンケートは年代順に入力されていないため、アンケートIDの自動番号は年表とは無関係です(並べ替えには役に立たない)。

私はこれを行うために2つのクエリを使用しています.1つは動物が最初に捕獲された日を示し、もう1つはその日のキャプチャ記録を返します。私は結果を更新可能にする必要があります。ここに私のクエリです:

SELECT [Capture Table].id_code, Min([Header (Survey) Table].Date) AS MinOfdate 
    FROM [Header (Survey) Table] INNER JOIN [Capture Table] ON [Header (Survey) Table].survey_id = [Capture Table].survey_id 
    GROUP BY ([Capture Table].[id_code]); 

そして:

SELECT [Header (Survey) Table].Date, [Header (Survey) Table].am_pm, [Capture Table].* 
    FROM [First Capture subQuery] INNER JOIN [Capture Table] ON [First Capture subQuery].id_code = [Capture Table].id_code) INNER JOIN [Header (Survey) Table] 
    ON ([Header (Survey) Table].survey_id = [Capture Table].survey_id) AND ([First Capture subQuery].MinOfdate = [Header (Survey) Table].date 

am_pmで結果をソートし、そのリストから日付/ IDコンボの最初のインスタンスを選択すると、このようになる可能性がありますが、SELECT TOPを適用してまだ取得する方法はわかりませんすべてのレコード&フィールド私はそれらの2つを超えて欲しいです(私は、単純化のために例で必要なフィールドの一部を含めませんでした)。

ありがとうございました!

EDIT:データのサンプル

ヘッダ表:


site  year  date   time  survey_id 
    REFFOR 1988  3-Jul-1998 AM  192 
    REFFOR 1988  3-Jul-1998 PM  180 

キャプチャー表


survey_id record  species  id_code capcode (1 = new capture, 2= recap) 
    192  1   PERMAN  A100  1  
    192  2   PERMAN  A104  2 
    192  3   PERMAN  A102  1 
    180  4   TAMAMO  A103  1 
    180  5   PERMAN  A100  2 
    180  6   TAMAMO  A101  1 

私がしようとしているのは、コードコードが正しいことを確認することです。つまり、私の例では、レコード1,3,4,&のレコードが私のクエリによって返されます。

しかし、今の私のクエリは一度PMでA100が一度AMの調査では7月3日に二回キャッチされたので、記録1,3,4、 & 6を返します(SurvId = 192)と調査(SurvID = 180)。

答えて

0

これは私が最終的に働くことになったものです。それだけで、それらのすべてのフィールドをプルアップされてあるようです何本でhttp://www.allenbrowne.com/subquery-01.html#TopN

SELECT st.site, st.year, ht3.date, ht3.time, ht3.trappers, ct3.trap_line, ct3.trap_no, ct3.species, ct3.id_type, ct3.[non-tag_id], ct3.id_code, ct3.age, ct3.sex, ct3.repro, ct3.wt_g, ct3.tail_mm, ct3.capcode, ct3.dead, ct3.comments, ct3.errata 
FROM [Session Table] AS st INNER JOIN ([Header (Survey) Table] AS ht3 INNER JOIN [Capture Table] AS ct3 ON ht3.survey_id = ct3.survey_id) ON st.session_ID = ht3.session_id 
WHERE ct3.id_code IN(
    SELECT ct2.id_code 
    FROM [Header (Survey) Table] ht2 INNER JOIN [Capture Table] ct2 ON ht2.survey_id = ct2.survey_id 
    WHERE (ct2.capcode = "2") AND ct2.capture_id IN 
    (SELECT TOP 1 ct.capture_id       
    FROM [Header (Survey) Table] ht INNER JOIN [Capture Table] ct ON ht.survey_id = ct.survey_id        
    WHERE ct.id_code = ct2.id_code 
    ORDER BY ct.id_code DESC, ht.date ASC, ht.time ASC) 
    ORDER BY ct2.id_code DESC, ht2.date ASC, ht2.time ASC); 
1

調査日にWHERE節のサブクエリを使用し、メインクエリのid_codeに条件付サブクエリを使用することを検討してください。結果セットは更新可能なクエリでなければなりません。

SELECT h.Date, h.am_pm, c.* 
FROM [Header (Survey) Table] h 
INNER JOIN [Capture Table] c ON (h.survey_id = c.survey_id) 
WHERE h.Date IN 
     (SELECT Min(hsub.Date) AS MinOfdate 
     FROM [Header (Survey) Table] hsub 
     INNER JOIN [Capture Table] csub ON hsub.survey_id = csub.subsurvey_id 
     WHERE csub.[id_code] = c.[id_code] 
     GROUP BY csub.[id_code]); 
+0

探し:それはパフェの答えの多くと同様に、私はここで見つけるヒントを使用しています。これは私がやる必要があるものの一部ですが、更新可能なビットは素晴らしいですが、それは私が必要とするこの他のことをしません。それはMin(Date)の午前&午後の調査で動物が捕獲されたときにAMレコードのみを選択し、それがMin(Date)の唯一の捕獲であればPM捕獲を戻します。しかし、答えをありがとう。私は正しく理解していることを願っています。 – user2934942

+0

AM/PMは時間の数字ですか?私たちもそれを最小限に抑えることができますか?通常、いくつかのデータスニペットを掲示することで説明すると便利です。 – Parfait

+0

いいえ。単なるラベルです(時にはトラップがチェックされた時があり、時には午前と夕刻にチェック/リセットされていることがあります)。私はいくつかの行を投稿します。 – user2934942