Функция окна - разница Dense_Rank и Row_Number - PullRequest
0 голосов
/ 06 февраля 2020

Если я использую оконную функцию dens_rank, приведенную ниже, которая дает мне мой вывод, который представляет собой транзакцию, возвращаемую по датам в порядке возрастания, и присваивает ей 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, ранжированную по столбцу с той же датой (транзакция_установка как c)?

В основном сгруппированы по циклу выставления счетов. Я хочу ранжировать самый ранний день как 1, просто хочу подтвердить, что в этом случае row_number даст мне такой же результат?

Спасибо

1 Ответ

1 голос
/ 06 февраля 2020

В вашем запросе разница между использованием dense_rank() и row_number() заключается в том, что первый допускает верхние связи, а второй - нет.

Таким образом, если две (или более) записи имеют одинаковые, самые ранние, transaction_settled_at для данного signup_id, то условие dense_rank() ... = 1 сохранит их обе, а row_number() выберет неопределенную запись из из двух.

Если нет риска связей, обе функции в вашем контексте будут создавать один и тот же результирующий набор данных.

Чтобы уменьшить вероятность связей, вы также можете добавить дополнительные критерии сортировки к order by предложение оконной функции:

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