Ms access 分组最后一个值的MS Access设计模式

Ms access 分组最后一个值的MS Access设计模式,ms-access,Ms Access,通常有一个表,其中的字段是account、value和time。检索每个帐户的最后一个值的最佳设计模式是什么?不幸的是,分组中的最后一个关键字提供了数据库中的最后一条物理记录,而不是通过任何排序得到的最后一条记录。这意味着永远不要使用它。我使用的两种笨拙的方法是子查询方法或二次查询来确定最后一条记录,然后连接到表以查找值。有没有更优雅的方法?子查询选项对我来说最合适,类似于下面的psuedosql。可能/有必要通过连接对其进行优化,这取决于SQL引擎的功能 select * from tabl

通常有一个表,其中的字段是account、value和time。检索每个帐户的最后一个值的最佳设计模式是什么?不幸的是,分组中的最后一个关键字提供了数据库中的最后一条物理记录,而不是通过任何排序得到的最后一条记录。这意味着永远不要使用它。我使用的两种笨拙的方法是子查询方法或二次查询来确定最后一条记录,然后连接到表以查找值。有没有更优雅的方法?

子查询选项对我来说最合适,类似于下面的psuedosql。可能/有必要通过连接对其进行优化,这取决于SQL引擎的功能

select * 
from table 
where account+time in (select account+max(time) 
                       from table 
                       group by account 
                       order by time) 
你能不能:

select account,last(value),max(time)
from table
group by account
我对此进行了测试(只针对一个非常小、几乎微不足道的记录集),并得到了正确的结果

编辑:


经过更多的测试后,这也不起作用。在过去的生活中,我做过不少access编程,我觉得有一种方法可以满足你在1个查询中的要求,但现在我还是一片空白。抱歉。

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

SELECT TOP 1 * FROM TableName ORDER BY Time DESC  
查看更多信息。

@shs
是的,select last(值)应该有效,但它不。。。我的理解是,尽管我无法生成授权源,但最后一个(值)给出了access文件中的最后一个物理记录,这意味着它可能是第一个时间段,但实际上是最后一个。所以我认为除了一个非常糟糕的随机行之外,你不应该用last(value)来表示任何东西。

@Tom 一般来说,我可能更容易执行您建议的“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) 

也许下面的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)
;

我试图使用Access 2003查询生成器查找组中的最新日期,但在尝试将LAST用作日期字段时遇到了相同的问题。但是使用MAX似乎可以找到最晚的日期。

经过多年的搜索,我终于在下面的链接3中找到了答案。上面的子查询可以工作,但速度非常慢——就我而言,速度非常慢

更常见的答案是三级查询:第一级查找最大值,第二级根据第一级查询获取字段值。然后将结果作为表加入到主查询中。快速但复杂且耗时的编码/维护

这个链接可以工作,仍然运行得很快,编码/维护的工作量要少得多。感谢这个网站的作者