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

时间:2020-03-05 18:48:40  来源:igfitidea点击:

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

解决方案

回答

subquery选项对我来说听起来最好,类似于下面的psuedo-sql。可能/有必要通过联接对其进行优化,这将取决于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

我对此进行了测试(获得了一个很小的,几乎是微不足道的记录集),并产生了适当的结果。

编辑:

经过更多测试后也无法正常工作。我在过去的生活中做了很多访问编程,觉得有一种方法可以完成我们在1个查询中的要求,但目前却空白。对不起。

回答

这是返回表中最后一条记录的好技巧:

SELECT TOP 1 * FROM TableName ORDER BY Time DESC

查看此网站以获取更多信息。

回答

@shs
是的,该select last(value)应该可以工作,但不能...我的理解,尽管我无法产生权威的信息,但last(value)给出了访问文件中的最后一个物理记录,这意味着可能是时间上的第一个,但实际上是最后一个。因此,我认为除了真正糟糕的随机行之外,我们不应将last(value)用于其他任何事情。

回答

汤姆
通常,对我来说,执行我们建议的"输入"查询可能会更容易。通常我会做类似的事情

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可以找到迟到日期。