0

我拥有的表格是客户、客户 ID、成本、日期,我想找到每个客户的最后 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

等等。所以对于 Alfred,我想拉出日期 7/2、3、5 和 6 的行。对于 Bob,我想拉出他所有的行。如果客户的日期/行少于 4 个,我不想要他们的任何行(尽管这可以单独完成 - 不是大问题)。仅提取每个客户的最后 4 个日期的行。

谢谢!

4

1 回答 1

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()改用。

于 2013-08-02T18:40:00.927 回答