MS ACCESS在一列上不同

时间:2010-11-19 13:06:58

标签: sql ms-access

我很难尝试针对MS ACCESS数据库编写查询。我正在选择的表(选项卡)包含3个字段:id,rId和time。我想为每个rId选择一条记录,我想要一个时间最长的记录。我试过的查询是这样的:

SELECT * FROM tab GROUP BY rId ORDER BY time;

然而,这给了我各种各样的错误,比如错误按顺序,而agrigator函数没有给出足够的参数或类似的东西。这个查询根本不可能写,或者我只是以错误的方式去做。

[注]
这不是我想在设计师中做的事情,我不是在做报告。我需要一个可以返回所需数据的查询。

4 个答案:

答案 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查询:

例如,您有此表:

CLIENTE || NOMBRES || MAIL

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或任何其他功能,并将该功能复制到子查询。

此选择将返回:

CLIENTE || NOMBRES || MAIL

888 || T800 ARNOLD || t800.arnold@cyberdyne.com

125 || SARAH CONNOR ||s.connor@skynet.com

请记住为您选择的列编制索引,并且distinct列必须没有大写或小写的数字数据,否则它将无效。这也只适用于一个挂号邮件。快乐的编码!!!