我很难尝试针对MS ACCESS数据库编写查询。我正在选择的表(选项卡)包含3个字段:id,rId和time。我想为每个rId选择一条记录,我想要一个时间最长的记录。我试过的查询是这样的:
SELECT * FROM tab GROUP BY rId ORDER BY time;
然而,这给了我各种各样的错误,比如错误按顺序,而agrigator函数没有给出足够的参数或类似的东西。这个查询根本不可能写,或者我只是以错误的方式去做。
[注]
这不是我想在设计师中做的事情,我不是在做报告。我需要一个可以返回所需数据的查询。
答案 0 :(得分:2)
如果您有GROUP BY子句,则需要具有聚合函数。相信错误信息。
试试这个:
SELECT rId, MAX(time) as highest FROM tab GROUP BY rId ORDER BY highest desc;
您将遇到名称为time
的列存在问题。它不是很具描述性,可能是关键字冲突。
答案 1 :(得分:0)
编辑,基于反馈/评论原始帖子。
根据反馈,我会将我的查询写成
select rID,
max( ID ) as LastIDAdded,
max( Time ) as LastDateTimeHistory
from
YourTable
group by
rid
现在,在Access中,通过使用他们的GUI,您必须让查询知道您正在进行总计。选择您的表并添加3列。然后,在指示您将要“总计”的行的行中,将MAX()放在ID和Time列下。此外,在进行总计时,会有一个GROUP BY行,您希望执行选择rID列下的复选框。这是我对Access查询界面最好的精神记忆,并且根据您运行的版本不确定。 HTH。
原始答案
虽然@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”记录,这些情况在这两种情况下并不是最后的“ID”序列按“rID”分组。
除了通过设计器在Access中设计查询而不是直接编写代码之外,其他所有功能都不太精彩,它可能有点棘手,需要您编写一个实际执行所需最终查询的函数。
如果您正在寻找这种情况,我将尝试重新挖掘并制作适用于上述示例的查询。并重新发回。
答案 2 :(得分:0)
试试这个:
SELECT * FROM tab t1 WHERE NOT EXISTS
(SELECT * FROM tab t2 WHERE t2.rid = t1.rid AND t2.time > t1.time);
如果我正确理解您的问题,那么不想要使用GROUP BY。您不希望来自行组的聚合数据,您希望从原始表中获得实际完整的行,但是您希望过滤掉除最新记录之外的所有行。
答案 3 :(得分:0)
对于Access,您可以使用我在此处提供的SQL Select查询:
例如,您有此表:
888 || T800 ARNOLD || t800.arnold@cyberdyne.com
123 || JOHN CONNOR || s.connor@skynet.com
125 || SARAH CONNOR ||s.connor@skynet.com
您只需要选择不同的邮件。你可以这样做:
SQL SELECT:
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 ARNOLD || t800.arnold@cyberdyne.com
125 || SARAH CONNOR ||s.connor@skynet.com
请记住为您选择的列编制索引,并且distinct列必须没有大写或小写的数字数据,否则它将无效。这也只适用于一个挂号邮件。快乐的编码!!!