Sql 从表中检索最后N条记录

Sql 从表中检索最后N条记录,sql,ms-access,ms-office,ms-access-2013,Sql,Ms Access,Ms Office,Ms Access 2013,我已经搜索了我的问题,但没有找到答案 我有一张桌子,包括 id(主键自动编号) 客户端id:标识每个客户端(唯一) 日期:每个客户的订单日期 我想在单个视图中检索每个客户机最近的N个订单日期 当然,我可以使用从订单中选择TOP N date FROM orders,其中client='xx'ORDER DESC,然后使用UNION为client指定不同的值。问题在于,随着客户群的变化,该报表将需要修订,而UNION报表对于庞大的客户群是不切实际的 作为一项附加要求,这需要在Access SQ

我已经搜索了我的问题,但没有找到答案

我有一张桌子,包括

  • id(主键自动编号)
  • 客户端id:标识每个客户端(唯一)
  • 日期:每个客户的订单日期
我想在单个视图中检索每个客户机最近的N个订单日期

当然,我可以使用
从订单中选择TOP N date FROM orders,其中client='xx'ORDER DESC
,然后使用
UNION
为client指定不同的值。问题在于,随着客户群的变化,该报表将需要修订,而
UNION
报表对于庞大的客户群是不切实际的


作为一项附加要求,这需要在Access SQL中工作。

步骤1:创建一个查询,为每一行的每个客户端按日期生成排名顺序。由于Access SQL不像SQL Server那样在(…)上有
行号()
,因此可以使用以下问题中描述的技术来模拟这一点:

如果您正确执行了步骤1,则结果应如下所示:

id   client_id    date      rank
----------------------------------
        1       2014-12-01   7 
        1       2014-12-02   6 
        1       2014-12-05   5 
        1       2014-12-07   4 
        1       2014-12-11   3 
        1       2014-12-14   2 
        1       2014-12-15   1 
        2       2014-12-01   2 
        2       2014-12-02   1
       ... 

步骤2:将步骤1中的结果用作子查询,并过滤结果,以便只有具有
等级的记录才能在MS Access中工作:

select t.*
from table as t
where t.date in (select top N t2.date
                 from table as t2
                 where t2.client_id = t.client_id
                 order by t2.date desc
                );

MS Access的一个问题是,如果存在连接,
top N
将检索超过
N
的记录。如果您想要精确的“N”,那么您可以在子查询中使用
orderbydate,id

好主意,但我认为您需要在
id
上进行WHERE比较,而不是在
date
上。考虑三个客户在<代码> 2014-1201 中订购的情况,但是对于其中的两个客户只有“相关的”(即,在最后五个订单中)。您的查询将返回所有三条记录。@Heinzi。我不明白你的评论。我认为OP非常清楚“每个客户的最后N个订单日期”。当然,如果OP在“最后N个订单日期”的定义中表示
id
,而不是
date
,那么他/她当然可以使用该字段。至于客户数量,这是通过
top
orderby
的交互来处理的。啊,我理解。当然,你是对的:我以为他想要“每个客户的最后N个订单日期”,即一个表
client\u id,date
,每个客户id最多有N个条目。当然,他给出的联合示例将导致“任何客户的最后5个订单日期内的所有日期”。您的SQL完美地解决了这个问题。我仍然相信他实际上可能想要第一个解释(这会更有意义)。谢谢戈登,这正是我所需要的。非常感谢你让我开心,