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
)
如果我使用下面的 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
)