MySQL - 百分比计算并在同一表的其他列中更新

夸克

我在 MySQL (phpMYAdmin) 中有一个表,其中包含以下列

MySQL表

我正在尝试确定每一行的百分位数并更新 G1Ptile 列中的值。G1Ptile 列是基于 G1% 的百分位数计算。我使用以下基于 John Woo 给出的答案here

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;

并获得以下输出

输出

输出在一个 select 语句中,我希望能够将它更新到我的表中的 G1Ptile 列,但是我无法使用更新它

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

您能否帮助修改查询/建议替代方法,以便我可以使用通过上述查询获得的百分位值并将其更新为同一个表中的 G1Ptile。我还有一个问题是 G1% 中有两个 20% 的值,但是分配给一个的百分位数是 20,另一个是 30。我希望它们都是 20,系列中的下一行是 30。

戈登·利诺夫

我会把你的计算写成:

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 DISTINCTORDER 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;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章