我正在尝试为 mysql 中的某些数据计算 spearmans 等级相关性。为此,我需要按降序排列我的数据。我得到了这个工作,但是当 2 行具有相同的变量时,等级应该是 2 个或更多等级的平均值。 作为示例,这里是一些具有当前排名和预期排名的示例数据
| id|var|rank|
| 8 | 1 | 1 |
| 2 | 2 | 2 | # rank should be 2.5
| 6 | 2 | 3 | # rank should be 2.5
| 4 | 3 | 4 |
| 5 | 4 | 5 |
| 1 | 5 | 6 |
| 3 | 6 | 7 | # rank should be 8
| 7 | 6 | 8 | # rank should be 8
| 9 | 6 | 9 | # rank should be 8
我的查询现在看起来像这样:
SET @rownum := 0;
SET @rownum2 := 0;
SELECT rank_x.id, rank_x.var1, rank_x.rk_x
FROM
(SELECT id, @rownum := @rownum + 1 AS rk_x, var1
FROM sampledata order by var1 asc) as rank_x;
最佳答案
您可以通过分配序号然后取平均值来做到这一点。这需要一些嵌套的子查询,但是是可行的。想法是:
- 先赋顺序值
- 然后找到每个 id 的最大值。
- 然后找到最小值
- 然后取平均值
查询看起来像:
SELECT id, var1, (minrn + maxrn) / 2
FROM (SELECT sd.*,
(@maxrn := if(@v2 = var1, @maxrn,
if(@v2 := var1, rn, rn)
)
) as maxrn
FROM (SELECT sd.*,
(@minrn := if(@v = var1, @minrn,
if(@v := var1, rn, rn)
)
) as minrn
FROM (SELECT id, var1, (@rn := @rn + 1) as rn
FROM sampledata sd CROSS JOIN
(SELECT @rn := 0) vars
ORDER BY var1 asc
) sd CROSS JOIN
(SELECT @minrn := 0, @v := -1) vars
ORDER BY var1, rn
) sd CROSS JOIN
(SELECT @maxrn := 0, @v2 := -1) vars
ORDER BY var1, rn desc
) sd;
关于mysql - 在mysql中获取多个排名的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26585703/