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

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

Я рассчитываю ранжирование каждого купона в каждом дилере на основе коэффициента отклика, и если два купона имели одинаковый коэффициент отклика, то мне нужно назначить лучший ранг для купонов, которые были отправлены чаще всего

Это скрипт, который я пробовал, но он неправильно ранжируется

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

Ответы [ 3 ]

0 голосов
/ 14 апреля 2019

использовать 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;
0 голосов
/ 14 апреля 2019

При просмотре вашего образца вы должны использовать только PARTITION BY DealerCode

  SELECT DealerCode, Coupon_name, emailsent, responders, responserate,
   RN = RANK()OVER(PARTITION BY DealerCode
   ORDER BY DealerCode,responserate,emailsent)
  FROM table123 
0 голосов
/ 14 апреля 2019

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