Как ранжировать записи внутри каждой группы, а также проверять другую переменную для присвоения ранга, если две записи имеют одинаковый ранг в группе на SQL Server?

#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. я не вижу отправленных сообщений здесь ни по порядку, ни по разделу. Пожалуйста, обратите внимание, что если частота ответов одинакова, мне нужно присвоить лучший рейтинг купону, который был отправлен чаще всего