Sql 窗口函数-密集秩和行数差

Sql 窗口函数-密集秩和行数差,sql,presto,Sql,Presto,如果我使用下面的密集秩窗口函数,该函数用于向我提供我的输出,即按升序在日期退款的交易,并将其分配为秩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

如果我使用下面的密集秩窗口函数,该函数用于向我提供我的输出,即按升序在日期退款的交易,并将其分配为秩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
我是否会得到与在同一日期(asc处的交易结算)列中使用行数窗口函数排序相同的结果

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


感谢您的查询,使用和的区别在于前者允许打领带,而后者不允许

因此,如果对于给定的
注册id
,两个(或更多)记录具有相同的、最早的
交易结算时间
,则条件
稠密等级()1
将保留这两条记录,而
row_number()
将从这两条记录中选择一条未定义的记录

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

为了减少联系的可能性,您还可以在窗口函数的
orderby
子句中添加额外的排序标准:

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

通过row_number()在这两条记录中保留一条未定义的记录,您的意思是只抓取一条领带,对吗?另外,您如何通过子句订购其他标准以减少关系?感谢@GMGThanks(2)其他列desc或asc如何影响排名第一的同一行?它们在所有列中都具有相同的属性,我无法分辨,因为我看不到您的数据。但是想法是要有N列可以用来断开连接(也就是说,它们不是所有重复行都有相同的值)。如果两个记录都是完全重复的(即所有列都相同),则无法消除歧义。