rank函数仅在redshift中返回带日期的1

时间:2019-11-15 21:41:48

标签: sql amazon-redshift window-functions

我正在redshift中运行以下代码。我想获得客户根据日期购买产品时的订单排名。每个购买都有一个唯一的票证ID,每个客户都有一个唯一的customer_uuid,每个产品都有一个唯一的product_id。下面的代码对于所有排名都返回1,但我不确定为什么。我的代码中是否有错误,或者在redshift中按日期字段进行排名是否有问题?有没有人看到如何修改此代码来解决此问题。

代码:

select customer_uuid,
        product_id,
        date,
    ticketid
        rank() 
        over(partition by customer_uuid,
        product_id,
ticketid order by date asc) as rank
        from table
        order by customer_uuid, product_id

数据:

customer_uuid product_id ticketid date    
1              2         1        1/1/18  
1              2         2        1/2/18  
1              2         3        1/3/18  

输出:

customer_uuid product_id ticketid date    rank
1              2         1        1/1/18  1  
1              2         2        1/2/18  1  
1              2         3        1/3/18  1

所需的输出:

customer_uuid product_id ticketid date    rank
1              2         1        1/1/18  1  
1              2         2        1/2/18  2  
1              2         3        1/3/18  3

2 个答案:

答案 0 :(得分:3)

首先,您在ticket_id中有partition by,这使得每一行都是唯一的。

第二,您正在使用rank()。如果要枚举,是否要row_number()

row_number() over(partition by customer_uuid, product_id order by date asc) as rank

答案 1 :(得分:1)

  

我希望获得客户根据日期购买产品时的订单排名。每个购买都有一个唯一的票证ID,每个客户都有一个唯一的customer_uuid,每个产品都有一个唯一的product_id。

基本上,您有唯一的(customer_uuid, product_id, ticket_id)元组。如果将它们用作分区,由于每个分区只有一条记录,因此排名始终为1

您只需要从分区中删除ticket_id

rank() over(
    partition by customer_uuid, product_id
    order by date
) as rank

注意:rank()将给予共享相同(customer_uuid, product_id, date)的记录同等的地位。