MySQL - 百分位数计算并在同一 table 的其他列中更新它
MySQL - Percentile calculation and update it in other column in the same table
我在 MySQL (phpMYAdmin) 中有一个 table,其中包含以下列
我正在尝试确定每行的百分位数并更新 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 语句中,我希望能够将它更新到我的 table 中的 G1Ptile 列,但是我无法使用
更新它
UPDATE `PCount` SET `G1Ptile`= --(All of the select query mentioned above)
能否请您帮助修改 query/suggest 替代方案,以便我可以使用通过上述查询获得的百分位数值,并在同一个 table 中将其更新为 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 DISTINCT
和 ORDER BY
在子查询中。这在 MySQL 的较新版本中是必需的(尽管在最新版本中您可以使用 window 函数)。
现在可以使用 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;
我在 MySQL (phpMYAdmin) 中有一个 table,其中包含以下列
我正在尝试确定每行的百分位数并更新 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 语句中,我希望能够将它更新到我的 table 中的 G1Ptile 列,但是我无法使用
更新它UPDATE `PCount` SET `G1Ptile`= --(All of the select query mentioned above)
能否请您帮助修改 query/suggest 替代方案,以便我可以使用通过上述查询获得的百分位数值,并在同一个 table 中将其更新为 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 DISTINCT
和 ORDER BY
在子查询中。这在 MySQL 的较新版本中是必需的(尽管在最新版本中您可以使用 window 函数)。
现在可以使用 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;