Oracle SQL中日期的排名函数

Posted

技术标签:

【中文标题】Oracle SQL中日期的排名函数【英文标题】:Rank function for date in Oracle SQL 【发布时间】:2015-10-29 20:48:02 【问题描述】:

例如,我有以下代码:

SELECT id, order_day, purchase_id FROM d

customer_idpurchase_id 是唯一的。每个customer_id 可以有多个purchase_id。假设每个人至少下了 5 个订单。

现在,我只想提取每个客户 ID 的前 5 个购买 ID(这取决于最早的购买日期)。我希望结果如下所示:

 id | purchase_id | rank
-------------------------
  A |  WERFEW43   |  1
  A |  ERTGDSFV   |  3
  A |  FDGRT45    |  2
  A |  BRTE4TEW   |  4
  A |  DFGDV      |  5
  B |  DSFSF      |  1
  B |  CF345      |  2
  B |  SDFSDFSDFS |  4

我想过排名order_day,但我的知识还不够好,无法完成。

【问题讨论】:

【参考方案1】:
select id,purchase_id, rank() over (order by order_day)
from d

您也可以试试dense_rank() over (order by order_day)row_number() over (order by order_day),选择更适合您的一种

【讨论】:

这不起作用。仅按天返回 5 个订单,而不是按 id。 @VDL over (partition by id order by order_day) 会有所帮助。要只返回 5 行,您应该添加 WHERE 条件。见@dnoeth 答案【参考方案2】:
select *
from
 ( SELECT
      id
     ,order_day
     ,purchase_id
     ,row_number()                    -- ranking
      over (partition by id           -- each customer
            order by order_day) as rn -- based on oldest dates
   FROM d
 ) as dt
where rn <= 5

【讨论】:

以上是关于Oracle SQL中日期的排名函数的主要内容,如果未能解决你的问题,请参考以下文章

求ORACLE SQL下的日期函数?

Oracle 中基于两个日期的排名[关闭]

oracle 查询每组的最大值

PL/SQL oracle,使用日期和时间的测试窗口

SQL 日期函数问题;我想写一个查询语句,是查表中日期字段后十天的数据

oracle trunc 函数处理日期格式,日期类型很有用的几个sql