【问题标题】:Rank function for date in Oracle SQLOracle 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,但我的知识还不够好,无法完成。

【问题讨论】:

    标签: sql oracle rank window-functions


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-15
      • 1970-01-01
      • 2012-03-20
      • 2012-04-05
      • 2013-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多