MS Access 2007 SQL:当id在多个日期重复出现时,选择日期/ ID组合的第一个实例

时间:2016-05-06 22:41:30

标签: sql ms-access

我正在尝试拉出数据库中捕获的动物的第一个实例。每只动物都有一个id码。

我目前正在使用与每个ID代码关联的最小日期。这在大多数情况下效果很好除了返回一对在同一天被捕获两次的动物(一次在AM会话期间和一次在PM会话期间)。我的查询返回当天的两个捕获,我只想要第一个。但是,我不能只过滤PM捕获,因为有时候动物会在下午被捕获。

目前,日期和AM / PM字段存储在调查表中,调查表通过调查ID链接到捕获表。来自8Jul2000的AM调查与PM调查的调查ID不同。调查没有按时间顺序输入,因此调查ID自动编号与年表无关(使其对分类无用)。

我现在正在使用两个查询来执行此操作,其中一个查出动物被捕获的第一天,然后是第二天从当天返回捕获记录。我需要我的结果可更新。以下是我的疑问:

    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应用于那些仍然得到所有记录&我想要的字段超出了那两个(为了简单起见,我没有在示例中包含我想要的一些字段)。

感谢您的帮助!

编辑:数据样本

标题表:

    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和& 6的记录将由我的查询返回。

但是,现在我的查询会返回记录1,3,4, 5 & 6,因为A100在7月3日被捕获两次,一次在AM调查中(SurvId = 192),一次在PM调查中(SurvID = 180)。

2 个答案:

答案 0 :(得分: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]);

答案 1 :(得分:0)

这是我最终开始工作的结果。它使用了很多Parfait的答案,以及我在这里找到的提示: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);