去年价值MS-访问设计模式的分组
这是常见的有一个表,其中例如字段是帐户,价值和时间。用于检索每个帐户最后一个值的最佳设计模式是什么?不幸的是,分组中的最后一个关键字为您提供了数据库中的最后一个物理记录,而不是任何排序中的最后一个记录。这意味着恕我直言,它永远不应该被使用。我使用的两种笨拙方法是子查询方法或辅助查询来确定最后一条记录,然后加入表中查找值。没有更优雅的方法吗?去年价值MS-访问设计模式的分组
子查询选项听起来对我来说最好,就像下面的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
我测试了这个(授予一个非常小的,几乎是微不足道的记录集)和它产生正确的结果。
编辑:
这也不能在一些更多的测试后工作。在过去的一段时间里,我做了一些相关的访问编程,并且觉得有一种方法可以完成你在一个查询中所要求的内容,但是现在我要画一个空白。抱歉。
@shs
是的,选择最后一个(价值)应该工作,但它不会......我的理解,虽然我不能产生权威的来源是最后一个(价值)给出了最后的物理记录在访问文件中,这意味着它可能是第一个时间,但最后一个是物理上的。所以我不认为你应该使用最后(价值)除了一个非常糟糕的随机行之外的任何东西。
@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查询生成器在一组最新的日期,并跑进试图用持续日期字段同样的问题。但它看起来像使用MAX查找lates日期。
后字面上年搜索的我终于找到了答案低于#3的链接。上面的子查询将起作用,但速度非常慢 - 对我的目的来说,速度减慢。
更受欢迎的答案是三级查询:第一级查找最大值,第二级查找基于第一查询的字段值。然后将结果作为表格连接到主查询。编码/维护快速但复杂且耗时。
这个链接工作,仍然运行得非常快,而且代码/维护工作量少得多。感谢这个网站的作者。