#sql #sql-server
#sql #sql-server
Вопрос:
У меня есть набор данных, который в основном сообщает вам, сколько купонов было отправлено для каждого розничного продавца и сколько ответило, их соответствующая частота ответов для каждого дилера и для каждого купона.
Я хочу ранжировать каждый купон у каждого дилера на основе скорости отклика, и если у двух купонов была одинаковая скорость отклика, тогда мне нужно присвоить лучший ранг купонам, которые были отправлены чаще всего
Это сценарий, который я пробовал, но он не ранжируется должным образом
SELECT
DealerCode, Coupon_name, emailsent, responders, responserate,
RN = RANK() OVER (PARTITION BY DealerCode, Coupon_name, responserate
ORDER BY DealerCode, responserate, emailsent)
FROM
table123
Это ожидаемый результат
RetailerCode Coupon_name emailsent responders responserate RN
----------------------------------------------------------------------
A1 Coupon 1 6 1 0.166666667 1
A1 Coupon 2 10 1 0.1 2
A1 Coupon 7 50 2 0.04 3
A1 Coupon 9 25 1 0.04 4
A2 Coupon 1 28 3 0.10714 2
A2 Coupon 4 12 0 0 3
A2 Coupon 3 1217 131 0.1076 1
A3 Coupon 2 63 10 0.1587 1
A3 Coupon 6 9 1 0.11111 2
A3 Coupon 7 3 0 0 3
A3 Coupon 8 2 0 0 4
A4 Coupon 4 174 22 0.1266782 3
A4 Coupon 3 1118 244 0.2182869 1
A4 Coupon 6 3091 420 0.135877 2
A5 Coupon 3 1227 78 0.06356962 2
A5 Coupon 2 780 50 0.064104 1
A5 Coupon 1 164 6 0.0365866 3
Комментарии:
1. вы также должны добавить согласованный образец данных.. Не только ожидаемый результат..
2. обновлен dataset…it сейчас, наверное, выглядит неплохо
3. я не вижу ни одного образца .. только ожидаемый результат
4. первые 5 столбцов — это образец данных, 6-й столбец — это то, что я ожидаю. Я попытался вставить данные из Excel, но они вставляются как URL-адрес изображения.
Ответ №1:
Глядя на ваш образец, вы должны использовать РАЗДЕЛ только ПО DealerCode
SELECT DealerCode, Coupon_name, emailsent, responders, responserate,
RN = RANK()OVER(PARTITION BY DealerCode
ORDER BY DealerCode,responserate,emailsent)
FROM table123
Ответ №2:
Звучит так, как будто вы хотите, чтобы PARTITION BY
dealercode
и coupon_name
и ORDER BY
responserate
и emailsent
и (при условии, что это содержит номер, который был отправлен купоном) оба по убыванию.
SELECT dealercode,
coupon_name,
emailsent,
responders,
responserate,
rn = rank() OVER (PARTITION BY dealercode,
coupon_name
ORDER BY responserate DESC,
emailsent DESC)
FROM table123;
Комментарии:
1. Это дает мне весь рейтинг как ‘1’… Столбец rn заполнен ‘1’: (…. да, emailsent — это количество отправленных купонов
2. @mavles: Пожалуйста, предоставьте демонстрацию, например, в db<>fiddle , которая показывает вашу проблему.
Ответ №3:
используйте row_number
SELECT dealercode,
coupon_name,
emailsent,
responders,
responserate,
row_number() OVER (PARTITION BY dealercode,
coupon_name
ORDER BY responserate DESC,
emailsent desc
) RN
FROM table123;
Комментарии:
1. я не вижу отправленных сообщений здесь ни по порядку, ни по разделу. Пожалуйста, обратите внимание, что если частота ответов одинакова, мне нужно присвоить лучший рейтинг купону, который был отправлен чаще всего