2014-12-27 99 views
1

我已经搜索到但未找到我的问题的答案。从表格中检索最近的N条记录

我有一个由

  • ID(主键自动编号)
  • CLIENT_ID的订单表:确定每个客户端(唯一的)
  • 日期:为每个客户端
订单日期

我想在单个视图中检索每个客户的最后N个订单日期

cour我可以使用SELECT TOP N date FROM orders WHERE client = 'xx' ORDER DESC,然后使用UNION作为客户端的不同值。问题在于,随着客户群的变化,该声明将需要修订,并且对于庞大的客户群而言,UNION声明不切实际。

作为一个额外的需求,这需要在Access SQL中工作。

回答

1

步骤1:创建一个查询,该查询按每个客户端的每个客户端的排序顺序产生

如果你已经做了第1步正确,你的结果应该是:由于访问SQL没有ROW_NUMBER() OVER (...)如SQL Server,你可以使用下面的问题中描述的技术模拟这个如下:

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使用该结果作为子查询和过滤的结果,使得只记录与返回。

+0

投票,因为我会建议同样的事 – 2014-12-27 19:16:27

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访问的问题是,top N将获取超过N记录,如果有关系。如果你想要“N”,那么你可以在子查询中使用order by date, id

+0

好主意,但我认为你需要做的'ID',而不是'日期'的WHERE比较。考虑三个客户在2014-12-01订购的情况,但它只有两个“相关”(即,在最后五个订单内)。您的查询将返回所有三条记录。 – Heinzi 2014-12-27 16:49:59

+0

@海因子。 。 。我不明白你的评论。我认为OP很清楚“每个客户的最后N个订单日期”。当然,如果OP在“最后N个订单日期”的定义中表示“id”而不是“date”,那么他/她当然可以使用该字段。至于客户的数量,这是通过'top'与'order by'的交互处理的。 – 2014-12-27 16:54:44

+0

啊,我明白了。当然,你是对的:我认为他希望“每个客户端的最后N个订单日期*”,即每个client_id最多有N个条目的表“client_id,date”。当然,他给出的UNION示例将导致“所有日期都在* any * client的最后5个订单日期之内”。你的SQL完美地解决了这个问题。我仍然相信他可能实际上需要第一个解释(这会更有意义)。 – Heinzi 2014-12-27 16:58:52