我正在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
答案 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)
的记录同等的地位。