我已搜索但未找到我的问题的答案。
我有一个由
组成的表格订单我想在单个视图中检索每个客户的最后N个订单日期
当然,我可以使用SELECT TOP N date FROM orders WHERE client = 'xx' ORDER DESC
,然后使用UNION
作为客户端的不同值。问题是,随着客户端基础的变化,语句需要修改,并且UNION
语句对于大客户群来说是不切实际的。
作为附加要求,这需要在Access SQL中使用。
答案 0 :(得分:1)
第1步:为每一行创建一个查询,按客户每个日期生成排名顺序。由于Access SQL没有像SQL Server这样的ROW_NUMBER() OVER (...)
,因此您可以使用以下问题中描述的技术来模拟此问题:
如果您已正确完成第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中的结果用作子查询,并过滤结果,以便仅返回包含rank <= N
的记录。
答案 1 :(得分: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”,则可以在子查询中使用order by date, id
。