Window 功能- Dense_Rank 和 Row_Number 区别

Window Function- Dense_Rank and Row_Number difference

如果我使用下面的 dense_rank window 函数,它会给我我的输出,即在日期按升序退款的交易并将其分配为 1 作为等级:

select p.billing_cycle_in_months, avg(t.days)
from (
    select *, 
        datediff(day,transaction_settled_at, transaction_refunded_at) as days,
        dense_rank() over (partition by signup_id order by transaction_settled_at asc) as rank
    from transactions
) t
join signups s on s.signup_id = t.signup_id
join plans p on p.id = s.plan_id
where datediff(year,s.started_at, current_date) > 1 and t.rank = 1
group by p.billing_cycle_in_months

我基本上会得到与使用 row_number window 函数在同一日期 (transaction_settled_at asc) 列上排名相同的结果吗?

基本上按计费周期分组我想将最早的一天排列为 1,只是想澄清在这种情况下 row_number 会给我相同的结果吗?

谢谢

在您的查询中,使用 dense_rank() and row_number() 的区别在于前者允许顶部连接,而后者不允许。

因此,如果两个(或更多)记录具有相同的、最早的 transaction_settled_at 对于给定的 signup_id,则条件 dense_rank() ... = 1 将同时保留它们,而 row_number() 将 select 两者中的未定义记录。

如果没有关系的风险,两个函数将在您的上下文中生成相同的结果数据集。

为了减少出现联系的可能性,您还可以在 window 函数的 order by 子句中添加额外的排序条件:

dense_rank() over (
    partition by signup_id 
    order by transaction_settled_at, some_other_column desc, some_more_column
)