Sql 查询-如果多个记录ID(非主键)匹配,请使用更晚的日期或更大的主键

Sql 查询-如果多个记录ID(非主键)匹配,请使用更晚的日期或更大的主键,sql,ms-access,ms-access-2010,Sql,Ms Access,Ms Access 2010,我构建了一个MS Access数据库,它通过调查来创建自定义报告。使用的调查应用程序没有提供我们需要的报告。我通常抓取excel中的数据,并将其导入access,然后按照我们需要的方式生成报告 这是第一次,我们让人们重做调查,因为他们正在更新某些内容或忘记添加某些内容。我需要能够获取最新的调查数据,这样我们在运行报告时就不会得到重复的数据。我的主报告由几个子报告组成。如果为空,则某些子报表将不可见,并且隐藏并缩小未回答的任何问题,以防止出现带有不必要空格的庞大报表 record ID (PK)

我构建了一个MS Access数据库,它通过调查来创建自定义报告。使用的调查应用程序没有提供我们需要的报告。我通常抓取excel中的数据,并将其导入access,然后按照我们需要的方式生成报告

这是第一次,我们让人们重做调查,因为他们正在更新某些内容或忘记添加某些内容。我需要能够获取最新的调查数据,这样我们在运行报告时就不会得到重复的数据。我的主报告由几个子报告组成。如果为空,则某些子报表将不可见,并且隐藏并缩小未回答的任何问题,以防止出现带有不必要空格的庞大报表

 record ID (PK) |  FName   |  LName   | IDNum   | Completed
     1          |  Bob     |  Smith   |  57     | 3/31/2013 5:00pm
     2          |  Bob     |  Smith   |  57     | 3/31/2013 7:00pm
我想要记录ID 2或在晚上7点完成的记录

查询和报告已经完成,因此我一直在尝试在查询的条件行中添加一行代码,以便在IDnum与多个记录匹配时获取最新的记录

在过去的几个小时里,我一直在努力寻找最好的方法。我不认为将我的表修改为“无重复表”,因为在数据库完成后,技术水平较低的人会使用它。他们所要做的就是导入一个新的excel文件来覆盖表,而查询则完成构建报告的所有工作。我也不想手动删除重复记录

我知道我需要和你一起做一些事情

 IIF(count(IDNum)>1, *something, *something)
*我被真假的部分卡住了。我如何告诉access它需要再次在表中检查以查找主键较大的记录

我以为这很容易,但我想我错了。哈哈

我是微软Access的新手,所以我知道我没有充分发挥自己的潜力,我可能从错误的角度出发。如有任何建议,将不胜感激。
我是一名信息系统专业的学生,因此我非常想学习如何做到这一点。

我相信您正在寻找的查询是

SELECT t1.*
FROM YourTable t1 INNER JOIN 
    (SELECT IDNum, MAX(Completed) AS MaxOfCompleted 
     FROM YourTable GROUP BY IDNum
    ) t2
ON t1.IDNum = t2.IDNum AND t1.Completed = t2.MaxOfCompleted;

当您使用if函数时,它应该是iif而不是iff。

我建议使用相关子查询,例如:

SELECT
Data.RecordID
, Data.FName
, Data.LName
, Data.IDNum
, Data.Completed

FROM
Data

WHERE
Data.Completed IN

(
SELECT TOP 1
DataSQ.Completed
FROM
Data as DataSQ

WHERE
DataSQ.IDNum = Data.IDNum

GROUP BY
DataSQ.Completed

ORDER BY
DataSQ.Completed DESC
)

GROUP BY
Data.RecordID
, Data.FName
, Data.LName
, Data.IDNum
, Data.Completed

;
解释

您可以在主查询的WHERE子句中嵌入另一个SELECT查询,而不是使用Max或IIF之类的函数。嵌套查询用于确定每个IDNum的最近完成日期。与使用SELECT TOP 1+ORDER BY直接从表中选择最新的调查不同,SELECT TOP 1+ORDER BY只返回一条记录,嵌套查询中的WHERE子句引用回主查询并为每个IDNum生成结果。这就是所谓的每组前N个模式,我发现它非常有用。请注意,在嵌套查询中,需要使用表名别名,以便Access能够区分这两个查询

另外,我通常建议不要尝试使用表PK来执行排序。在很多情况下,主键顺序值不是相关字段值的良好指示器


这段代码在虚拟数据上测试时有效-祝你好运

这正是我所需要的。我不知道我可以在access中这样指定我的表。因为它是SQL,所以很有意义。非常感谢