我拥有的表是客户,客户,成本,日期 我想找到每个客户的最后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和&的行。对于鲍勃,我想拉他所有的行。如果客户的日期/行数少于4个,我不想要任何行(尽管这可以单独完成 - 不是大问题)。只拉动每个客户的最后4个日期的行。
谢谢!
答案 0 :(得分:0)
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()
。