【问题标题】:MySQL - Percentile calculation and update it in other column in the same tableMySQL - 百分比计算并在同一张表的其他列中更新它
【发布时间】:2019-05-01 11:51:42
【问题描述】:

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

我正在尝试确定每一行的百分位数并更新 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。

【问题讨论】:

    标签: mysql sql phpmyadmin percentile


    【解决方案1】:

    我会把你的计算写成:

    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;
    

    【讨论】:

    • 非常感谢 Gordon,很遗憾我在运行您的查询时遇到错误。你能给些建议么。 #1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 15 行的 '(SELECT COUNT(*) FROM p) pp ) pp ON pp.G1% = p.G1% SET ' 附近使用正确的语法
    • @Quark。 . .该行应该已被删除。我决定把逻辑放在`params.
    • Gordon,您的解决方案运行良好,我的 G1Ptile 表已使用百分位数进行了更新,但是我注意到如果我有两个相似的 G1% 值,百分位数从 20 开始,如果我有两个相似的 G1% 值,百分位数从 60 开始有6个相似的值等等。我从您的查询中删除了 DISTINCT,但是将百分位数显示为 0,10,20,80*6,90... 我不希望您向我提供现成的查询,但是如果您能解释一下查询,我将不胜感激一点点,这样我就可以尝试修改它以满足我的要求。
    • 我可以做一些类似 DISTINCT 总计的事情吗?
    • @Quark。 . .你可能想要count(distinct "G1%''
    猜你喜欢
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    • 2013-03-22
    • 2022-06-23
    相关资源
    最近更新 更多