gpt4 book ai didi

mysql - MYSQL 中百分位数/排名的高效分配

转载 作者:可可西里 更新时间:2023-11-01 08:07:45 25 4
gpt4 key购买 nike

我有几个非常大的表(超过 400,000 行),如下所示:

+---------+--------+---------------+
| ID | M1 | M1_Percentile |
+---------+--------+---------------+
| 3684514 | 3.2997 | NULL |
| 3684515 | 3.0476 | NULL |
| 3684516 | 2.6499 | NULL |
| 3684517 | 0.3585 | NULL |
| 3684518 | 1.6919 | NULL |
| 3684519 | 2.8515 | NULL |
| 3684520 | 4.0728 | NULL |
| 3684521 | 4.0224 | NULL |
| 3684522 | 5.8207 | NULL |
| 3684523 | 6.8291 | NULL |
+---------+--------+---------------+...about 400,000 more

我需要为 M1_Percentile 列中的每一行分配一个值,该值表示“M1 值等于或低于当前行的 M1 值的行的百分比”

换句话说,我需要:

enter image description here

我成功地实现了这个,但是它太慢了。如果有人可以创建以下代码的更高效版本,我将不胜感激!

UPDATE myTable AS X JOIN (
SELECT
s1.ID, COUNT(s2.ID)/ (SELECT COUNT(*) FROM myTable) * 100 AS percentile
FROM
myTable s1 JOIN myTable s2 on (s2.M1 <= s1.M1)
GROUP BY s1.ID
ORDER BY s1.ID) AS Z
ON (X.ID = Z.ID)
SET X.M1_Percentile = Z.percentile;

如果行数限制为您看到的行数(10 行),这是上述查询的(正确但缓慢的)结果:

+---------+--------+---------------+
| ID | M1 | M1_Percentile |
+---------+--------+---------------+
| 3684514 | 3.2997 | 60 |
| 3684515 | 3.0476 | 50 |
| 3684516 | 2.6499 | 30 |
| 3684517 | 0.3585 | 10 |
| 3684518 | 1.6919 | 20 |
| 3684519 | 2.8515 | 40 |
| 3684520 | 4.0728 | 80 |
| 3684521 | 4.0224 | 70 |
| 3684522 | 5.8207 | 90 |
| 3684523 | 6.8291 | 100 |
+---------+--------+---------------+

为整个 400,000 行生成相同的结果需要更长的时间。

最佳答案

我无法测试这个,但你可以尝试类似的东西:

update table t
set mi_percentile = (
select count(*)
from table t1
where M1 < t.M1 / (
select count(*)
from table));

更新:

update test t
set m1_pc = (
(select count(*) from test t1 where t1.M1 < t.M1) * 100 /
( select count(*) from test));

这适用于 Oracle(我唯一可用的数据库)。我确实记得在 MySQL 中遇到过该错误。这很烦人。

关于mysql - MYSQL 中百分位数/排名的高效分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7086751/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com