【问题标题】:Incremental count增量计数
【发布时间】:2018-06-20 11:10:05
【问题描述】:

我有一个包含客户编号和订单日期列表的表格,并希望对每个客户编号添加一个计数,每次客户编号更改时从 1 重新开始,我已将表格排序为客户然后日期订单,并且需要添加订单计数列。

CASE WHEN 'Customer Number' on This row = 'Customer Number' on Previous Row then ( Count = Count on Previous Row + 1 ) 
Else Count = 1

解决这个问题的最佳方法是什么?

客户和客户中的日期然后日期顺序:

Customer    Date      Count
0001        01/05/18  1 
0001        02/05/18  2
0001        03/05/18  3
0002        03/05/18  1  <- back to one here as Customer changed
0002        04/05/18  2
0003        05/05/18  1  <- back to one again

我刚刚尝试过COUNT(*) OVER (PARTITION BY Customer ) as COUNT,但由于某种原因,当客户更改时,它似乎不是从 1 开始的

【问题讨论】:

  • 您可以在您的问题中添加一些表格格式的数据吗?你的逻辑并不完全清楚(至少对我来说不是)。

标签: sql oracle lag window-functions lead


【解决方案1】:

很难说出您想要什么,但是“为每个客户编号添加一个计数,每次客户编号更改时从 1 重新开始”听起来好像您只是想要:

count(*) over (partition by customer_number) 

或者这应该是“直到”行日期的计数:

count(*) over (partition by customer_number order by order_date) 

【讨论】:

  • 嗨,如果我没有很好地解释它,很抱歉:-) 基本上需要做这样的事情...... Cust Date Count 0001 01/02/18 1 0001 02/02/18 2 0001 03/02/18 3 0002 05/03/18 1 0002 06/03/18 2 0003 01/02/18 1
  • @Gavin:在 cmets 中解释这一点。 EDIT你的问题。
【解决方案2】:

听起来你只是想给an analytic row_number()打电话:

select customer_number,
  order_date,
  row_number() over (partition by customer_number order by order_date) as num
from your_table
order by customer_number,
  order_date

使用analytic count 也可以,正如@horse_with_no_name 所建议的那样:

  count(*) over (partition by customer_number order by order_date) as num

显示两者的快速演示,以及 CTE 中的示例数据:

with your_table (customer_number, order_date) as (
            select '0001', date '2018-05-01' from dual
  union all select '0001', date '2018-05-03' from dual
  union all select '0001', date '2018-05-02' from dual
  union all select '0002', date '2018-05-03' from dual
  union all select '0002', date '2018-05-04' from dual
  union all select '0003', date '2018-05-05' from dual
)
select customer_number,
  order_date,
  row_number() over (partition by customer_number order by order_date) as num1,
  count(*) over (partition by customer_number order by order_date) as num2
from your_table
order by customer_number,
  order_date
/

CUST ORDER_DATE       NUM1       NUM2
---- ---------- ---------- ----------
0001 2018-05-01          1          1
0001 2018-05-02          2          2
0001 2018-05-03          3          3
0002 2018-05-03          1          1
0002 2018-05-04          2          2
0003 2018-05-05          1          1

【讨论】:

    猜你喜欢
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    • 2016-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    相关资源
    最近更新 更多