Sql MS ACCESS在一列上是不同的

Sql MS ACCESS在一列上是不同的,sql,ms-access,Sql,Ms Access,我很难对MS ACCESS数据库编写查询。我从中选择的表(选项卡)包含3个字段:id、rId和time。我想要为每个rId选择一个记录,并且我想要一个具有最高时间的记录。我尝试的查询如下: SELECT * FROM tab GROUP BY rId ORDER BY time; 然而,这给了我各种各样的错误,比如ORDERBY中的错误,以及agrigator函数没有给出足够的参数之类的。是这个问题根本不可能写出来,还是我只是走错了方向 [注意] 这不是我试图在设计师身上做的事情,我也不是在做

我很难对MS ACCESS数据库编写查询。我从中选择的表(选项卡)包含3个字段:id、rId和time。我想要为每个rId选择一个记录,并且我想要一个具有最高时间的记录。我尝试的查询如下:

SELECT * FROM tab GROUP BY rId ORDER BY time;
然而,这给了我各种各样的错误,比如ORDERBY中的错误,以及agrigator函数没有给出足够的参数之类的。是这个问题根本不可能写出来,还是我只是走错了方向

[注意]

这不是我试图在设计师身上做的事情,我也不是在做报告。我需要一个可以返回所需数据的查询。

如果有GROUP BY子句,则需要有一个聚合函数。相信错误信息

试试这个:

SELECT rId, MAX(time) as highest FROM tab GROUP BY rId ORDER BY highest desc;
SELECT * FROM tab t1 WHERE NOT EXISTS
   (SELECT * FROM tab t2 WHERE t2.rid = t1.rid AND t2.time > t1.time);

您将遇到名为
time
的列的问题。这不是很具描述性,可能是关键词冲突。

根据原始帖子的反馈/评论进行编辑

根据反馈,我将把我的查询写为

select rID,
       max( ID ) as LastIDAdded,
       max( Time ) as LastDateTimeHistory
   from
       YourTable
   group by 
      rid
现在,在Access中,通过使用他们的GUI,您必须让查询知道您正在进行合计。选择表并添加3列。然后,在指示要“总计”的行中,将MAX()放在ID和Time列下。此外,在进行总计时,将有一个分组行,您需要在rID列下选择do复选框。这是我对Access查询界面最好的记忆,并且基于您正在运行的版本不确定。嗯

原始答案

尽管@duffymo有一个典型查询选项,可以获得一个max()分组依据,但我不确定这正是您想要的。如您所述,您有3个字段。您的“id”似乎是一个代理项,或用于在表中保留唯一行的自动增量id键。您的“rID”是您想要分组的依据,时间是获取给定组中的最近时间

根据记录的添加方式以及之前的客户的情况,记录在调度系统中进行处理,在调度系统中,任何记录都可以有任何“时间”标记。所以按顺序,你可以得到

ID   rID   Time
1     1     1pm
2     2     4pm
3     2     5pm
4     1     9AM
5     2     3pm

In such case, if you grouped by rID, your MAX() on time for rID = 1 would be the 1pm slot with ID = 1.  And for group rID = 2, the MAX() time of 5pm would be ID = 3.
这就是说,如果您打算利用“ID”列进行绑定,那么您也需要获得正确的“ID”记录,在这两种情况下,它不是“rID”在每个组中的最后一个“ID”序列

通过设计器在Access中设计查询而不是直接编写代码的所有其他功能都不太好,这可能有点棘手,需要您编写一个函数来实际执行所需的最终查询

如果您正在寻找这个场景,那么我将尝试重新挖掘并构建对上述示例有效的查询。然后重新发回。

尝试以下操作:

SELECT rId, MAX(time) as highest FROM tab GROUP BY rId ORDER BY highest desc;
SELECT * FROM tab t1 WHERE NOT EXISTS
   (SELECT * FROM tab t2 WHERE t2.rid = t1.rid AND t2.time > t1.time);

如果我正确理解您的问题,您不想使用分组方式。您不希望从多组行中聚合数据,您希望从原始表中获得实际完整的行,但希望筛选出除最新记录以外的所有记录。

对于访问,您可以使用我在此处提供的SQL Select查询:

例如,您有以下表格:

客户| |姓名| | |邮件 888 | T800阿诺德| T800。arnold@cyberdyne.com

123 |约翰·康纳| s。connor@skynet.com

莎拉·康纳s。connor@skynet.com

您只需要选择不同的邮件。您可以通过以下方式进行操作:

SQL选择:

SELECT MAX(p.CLIENTE) AS ID_CLIENTE
, (SELECT TOP 1 x.NOMBRES 
FROM Rep_Pre_Ene_MUESTRA AS x 
WHERE x.MAIL=p.MAIL 
 AND x.CLIENTE=(SELECT MAX(l.CLIENTE) FROM Rep_Pre_Ene_MUESTRA AS l WHERE x.MAIL=l.MAIL)) AS NOMBRE, 
p.MAIL
FROM Rep_Pre_Ene_MUESTRA AS p
GROUP BY p.MAIL;
您可以使用它来选择最大ID,该最大ID的对应名称,您可以通过这种方式添加任何其他属性。然后在最后,您将该独特列放入过滤器,并且您只将其与最后一个独特列分组

这将为您带来对应数据的最大ID,您可以使用min或任何其他函数,并将该函数复制到子查询中

此选择将返回:

客户| |姓名| | |邮件 888 | T800阿诺德| T800。arnold@cyberdyne.com

莎拉·康纳s。connor@skynet.com


请记住为您选择的列编制索引,并且不同的列不能包含全部大写或小写的数字数据,否则它将不起作用。这也只适用于一封挂号信。快乐编码

因为您是按时间排序的,所以也可以使用FIRST(time)来提高性能。该列没有命名为time,它只是一个简单的模型。而且,我需要选择表中的所有字段,而不仅仅是rId。rId实际上相当无趣,它只会像字典中的键一样使用。如果使用真实的字段名,那么会容易得多,这样我们就不会在纠正诸如“时间”之类愚蠢的字段名所带来的问题时偏离正轨。Access不需要为
分组依据
使用聚合函数。这将非常好。是的,你是对的(如果我理解正确的话),我需要表中的所有列,而不仅仅是最大时间。为了进一步解释,这是一个组件历史记录表。每个组件都可以有几个历史记录,我对获取每个组件的最新历史记录感兴趣。组件外键是rID,时间实际上不是时间,而是日期时间,但这不重要。我还没能写一个查询来解决这个问题。@Alxandr,这里要知道的关键是。。。1.ID是每个记录的代理自动递增序列号。。。2.时间列(datetime)基于记录实际添加到表中的时间,而不是基于我的场景,在我的场景中,任何日期/时间都可以像上面的场景中的调度器一样添加。如果#2是添加历史组件的日期/时间,请查看我的修订答案……不,时间与创建时间没有任何关系。可以更改历史记录的时间,以便创建历史记录的时间晚于实际发生的时间,并且可以设置时间。因此,不保证递增的ID与它们在s时“应该”排序的顺序匹配