我拥有的表是customer,customerid,cost,date,我想为每个客户找到最后4个日期,这样我最终可以在这些日期上进行聚合。不是所有的顾客都有相同的日期。对于一些成本为0的客户,缺少行(因此也包括日期)。
Customer ID Cost Date
Alfred 1 100 7/1
Alfred 1 100 7/2
Alfred 1 200 7/3
Alfred 1 300 7/5
Alfred 1 200 7/6
Bob 2 500 7/4
Bob 2 500 7/5
Bob 2 500 7/6
Bob 2 500 7/7
等等,对于阿尔弗雷德,我想拉出日期为7/2,3,5和6的行。对于Bob,我想拉出他的所有行。如果客户的日期/行少于4行,我不希望它们中的任何一行(尽管这可以单独完成--这不是大问题)。只提取每个客户的最后4个日期的行。
谢谢!
发布于 2013-08-02 18:40:00
大多数SQL方言都支持dense_rank()
窗口函数。这正是解决这个问题所需要的:
select t.Customer, t.ID, t.Cost, t.Date
from (select t.*,
dense_rank() over (partition by Customer order by "Date" desc) as seqnum
from t
) t
where seqnum <= 4;
Dense_rank()
通过在数据中包含来自最近四个日期的所有行来处理重复的数据。如果您想要从最近的日期准确地排到四行,那么使用row_number()
代替。
https://stackoverflow.com/questions/18023906
复制相似问题