分组最后一个值的 MS-Access 设计模式
Posted
技术标签:
【中文标题】分组最后一个值的 MS-Access 设计模式【英文标题】:MS-Access design pattern for last value for a grouping 【发布时间】:2008-09-06 12:37:41 【问题描述】:通常有一个表格,例如字段是帐户、价值和时间。检索每个帐户的最后一个值的最佳设计模式是什么?不幸的是,分组中的最后一个关键字为您提供了数据库中的最后一条物理记录,而不是任何排序的最后一条记录。这意味着恕我直言,它永远不应该被使用。我使用的两种笨拙的方法是子查询方法或辅助查询来确定最后一条记录,然后加入表以查找值。难道没有更优雅的方法吗?
【问题讨论】:
【参考方案1】:子查询选项对我来说听起来最好,类似于以下 psuedo-sql。可能/有必要通过连接对其进行优化,这取决于 SQL 引擎的功能。
select *
from table
where account+time in (select account+max(time)
from table
group by account
order by time)
【讨论】:
【参考方案2】:这是返回表中最后一条记录的好技巧:
SELECT TOP 1 * FROM TableName ORDER BY Time DESC
查看this site 了解更多信息。
【讨论】:
【参考方案3】:你不能这样做吗:
select account,last(value),max(time)
from table
group by account
我对此进行了测试(授予一个非常小的、几乎微不足道的记录集)并且它产生了正确的结果。
编辑:
经过更多测试后,这也不起作用。我在过去的生活中进行了相当多的访问编程,并且觉得有一种方法可以完成您在 1 个查询中提出的要求,但目前我还是一片空白。对不起。
【讨论】:
【参考方案4】:@汤姆 一般来说,我可能更容易执行您建议的“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)
【讨论】:
【参考方案5】:经过多年的搜索,我终于在#3 下面的链接中找到了答案。上面的子查询可以工作,但速度很慢——就我的目的而言,速度非常慢。
更流行的答案是三级查询:第一级查找最大值,第二级根据第一级查询获取字段值。然后将结果作为一个表加入到主查询中。编码/维护快速但复杂且耗时。
此链接有效,运行速度仍然很快,并且代码/维护工作量要少得多。感谢本网站的作者。
http://access.mvps.org/access/queries/qry0020.htm
【讨论】:
【参考方案6】:@shs 是的,选择 last(value) 应该工作,但它不......我的理解虽然我无法提供权威来源,但 last(value) 给出了访问文件中的最后一个物理记录,这意味着它在时间上可能是第一个,但在物理上可能是最后一个。所以我认为你不应该将 last(value) 用于除非常糟糕的随机行之外的任何内容。
【讨论】:
【参考方案7】:我正在尝试使用 Access 2003 查询生成器查找组中的最新日期,但在尝试将 LAST 用于日期字段时遇到了同样的问题。但看起来使用 MAX 会找到最晚的日期。
【讨论】:
【参考方案8】:也许下面的 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)
;
【讨论】:
以上是关于分组最后一个值的 MS-Access 设计模式的主要内容,如果未能解决你的问题,请参考以下文章
寻求代码设计建议:使用 VB.Net 和 Ms-Access
MS-Access 按具有 count(*) > 1 奇怪行为的列分组?