mysql - 在mysql中获取多个排名的平均值

标签 mysql correlation

我正在尝试为 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/

相关文章:

mysql - 谷歌数据工作室 : cumulative column

r - 组合对的相关性

r - ggpairs : Colouring the geoms by a Factor

python - Pandas 列之间的成对相关性数组

python - scipy.stats.pearsonr(x, y) 中的非相关检验是什么?

matlab - 如何在 Matlab 中将相关矩阵可视化为模式球

MySQL触发器检查插入是否成功

php - SQL嵌套选择固定

Java Web 应用程序无法连接到 AWS RDS 数据库实例

c# - ADO.Net Entity Framework ,数据读取期间遇到 fatal error