MS-Access设计模式,用于分组的最后一个值

时间:2008-09-06 12:37:41

标签: ms-access

通常有一个表格,例如字段是帐户,值和时间。检索每个帐户的最后一个值的最佳设计模式是什么?不幸的是,分组中的最后一个关键字为您提供数据库中的最后一条物理记录,而不是任何排序的最后一条记录。这意味着恕我直言,它永远不应该被使用。我使用的两种笨拙的方法是子查询方法或次要查询来确定最后一条记录,然后加入表来查找值。是不是有更优雅的方法?

8 个答案:

答案 0 :(得分:1)

子查询选项对我来说听起来最好,类似于下面的psuedo-sql。可能/有必要通过连接来优化它,这将取决于SQL引擎的功能。

select * 
from table 
where account+time in (select account+max(time) 
                       from table 
                       group by account 
                       order by time) 

答案 1 :(得分:1)

你可以不这样做:

select account,last(value),max(time)
from table
group by account

我对此进行了测试(授予了一个非常小的,几乎无足轻重的记录集)并且它产生了正确的结果。

编辑:

在经过一些更多测试之后也不起作用。我在过去的生活中做过相当多的访问编程,并且觉得有一种方法可以在1个查询中执行您的询问,但我现在正在绘制一个空白。遗憾。

答案 2 :(得分:1)

这是返回表中最后一条记录的好方法:

SELECT TOP 1 * FROM TableName ORDER BY Time DESC  

查看this site了解详情。

答案 3 :(得分:1)

@汤姆 一般来说,我可能更容易进行您建议的“In”查询。一般来说,我会做类似

的事情
select T1.account, T1.value
from table T as T1
where T1 = (select max(T2.time) from table T as T2 where T1.account = T2.Account) 

答案 4 :(得分:1)

经过几年的搜索,我终于在#3下面的链接中找到了答案。上面的子查询将起作用,但速度非常慢 - 对于我的目的而言非常缓慢。

更受欢迎的答案是三级查询:第一级查找最大值,第二级获取基于第一级查询的字段值。然后将结果作为表连接到主查询。编码/维护快速但复杂且耗时。

此链接有效,运行速度非常快,代码/维护工作量也少得多。感谢本网站的作者。

http://access.mvps.org/access/queries/qry0020.htm

答案 5 :(得分:0)

@shs
是的,选择最后一个(值)应该工作,但它没有...我的理解虽然我不能产生一个授权源是最后一个(值)给出了访问文件中的最后一个物理记录,这意味着它可能是第一个在时间上,但最后一个在物理上。所以我认为除了非常糟糕的随机行之外,你不应该使用last(value)。

答案 6 :(得分:0)

也许下面的SQL很笨拙,但它似乎在Access中正常工作。

SELECT
    a.account,
    a.time,
    a.value
FROM
    tablename AS a INNER JOIN [
        SELECT
            account,
            Max(time) AS MaxOftime
        FROM
            tablename
    GROUP BY
        account
    ]. AS b
    ON
        (a.time = b.MaxOftime)
        AND (a.account = b.account)
;

答案 7 :(得分:0)

我正在尝试使用Access 2003查询构建器在组中查找最新日期,并遇到同样的问题,尝试将LAST用于日期字段。但看起来使用MAX会找到lates date。