#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 . . . Если это сработает, вы можете рассмотреть возможность принятия ответа.