Оконная функция sql

#sql

Вопрос:

У меня есть столик

 UserId   DateOfPurchase   TotalNumberOfPurchase 
10        2020-04-03       2
10        2020-04-03       2
20        2020-04-02       2
20        2020-04-03       2
34        2020-04-01       1
45        2020-04-09       1
67        2020-04-07       1
 

Мне нужно создать select * из этой таблицы дополнительный столбец со значениями «CustomerRating», первый клиент с наибольшим числом заказов.
Если у двух клиентов одинаковое общее количество покупок, топ будет с самой ранней покупкой.
Мне нужно получить это:

 1
1
2
2
3
4
5
 

Я знаю, что мне нужно использовать строку функции окна RANK(), ROW_NUMBER() , но как и что?

Комментарии:

1. Пожалуйста, опубликуйте, что вы пробовали с результатами, а также какие СУБД вы используете?

Ответ №1:

Хммм . . . Вы можете использовать dense_rank() , но вам нужна минимальная дата покупки для каждого пользователя:

 select t.*,
       dense_rank() over (order by TotalNumberOfPurchase desc, min_DateOfPurchase asc) as ranking
from (select t.*, min(DateOfPurchase) over (partition by userid) as min_DateOfPurchase
      from t
     ) t;
 

Вот скрипка db<>.

Комментарии:

1. Спасибо, я попробовал ваше решение, но все равно у меня 1,2,3,4,5,6,7 вместо 1,1,2,2,3,4,5

2. @Toto6ka . . . Я добавил скрипку db<>. Это дает именно те результаты, которые вы указываете в вопросе о данных в вопросе. Следовательно, это отвечает на вопрос. Если у вас есть другой вопрос, задайте его как новый вопрос.

3. Большое спасибо! Это работает, я глупо сделал ошибку, когда скопировал его.

4. @Toto6ka . . . Если это сработает, вы можете рассмотреть возможность принятия ответа.