MySQL - Процентильный расчет и обновление его в другом столбце той же таблицы - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть таблица в MySQL (phpMYAdmin) со следующими столбцами

MySQL Table

Я пытаюсь определить процентиль для каждой строки и обновить это значение в столбце G1Ptile.Столбец G1Ptile - это расчёт процентиля, основанный на G1%.Я использую следующее на основе ответа Джона Ву, данного здесь

SELECT  `G1%`, 
       (1-ranks/totals)*100 Percentile FROM (
SELECT  distinct `G1%`,
        @rank:=@rank + 1 ranks,
        (SELECT COUNT(*) FROM PCount) totals
FROM    PCount a,
        (SELECT @rank:=0) s
ORDER   BY `G1%` DESC ) s;

и получаю следующий вывод

Output

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

UPDATE `PCount` SET `G1Ptile`= --(All of the select query mentioned above) 

Можете ли вы помочь с изменением запроса / предложить альтернативутак что я могу использовать процентили, полученные с помощью вышеуказанного запроса, и обновить его до G1Ptile в той же таблице.Еще одна проблема, с которой я столкнулся, состоит в том, что в G1% есть два значения 20%, однако процентиль, назначенный одному, равен 20, а другому - 30. Я хочу, чтобы оба они были равны 20, а следующий ряд в серии - 30.

1 Ответ

0 голосов
/ 29 ноября 2018

Я бы написал ваш расчет следующим образом:

SELECT `G1%`, 
       (1 - ranks / totals) * 100 as Percentile
FROM (SELECT `G1%`,
              (@rank := @rank + 1) ranks,
              (SELECT COUNT(*) FROM PCount) as totals
      FROM (SELECT DISTINCT `G1%`
            FROM PCount
            ORDER BY `G1%` DESC
           ) p CROSS JOIN
           (SELECT COUNT(*) as totals, @rank := 0
            FROM Pcount
           ) params
     ) p;

Я внес некоторые изменения, более соответствующие тому, как MySQL обрабатывает переменные.В частности, SELECT DISTINCT и ORDER BY находятся в подзапросе.Это необходимо в более поздних версиях MySQL (хотя в самых последних версиях вы можете использовать оконные функции).

Теперь это можно включить в обновление с помощью JOIN:

UPDATE PCount p JOIN
       (SELECT `G1%`, 
                (1 - ranks / totals) * 100 as Percentile
        FROM (SELECT `G1%`,
                      (@rank := @rank + 1) ranks,
                      (SELECT COUNT(*) FROM PCount) as totals
              FROM (SELECT DISTINCT `G1%`
                    FROM PCount
                    ORDER BY `G1%` DESC
                   ) p CROSS JOIN
                   (SELECT COUNT(*) as totals, @rank := 0
                    FROM Pcount
                   ) params
             ) pp
       ) pp
       ON pp.`G1%` = p.`G1%`
    SET p.G1Ptile = pp.percentile;
...