sql:不使用pivot获取多列的方差

gev0vcfq  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(361)

我在sql中有一个数据表(dt),如下所示:

ID        state_id     act  rd_1 rd_2    rd_3   rd_4  rd_5
11        abc,13.3      1    1.   31     17.4   32.4  0.4
11        afd,23.2      4    1.   42.1   1.3    31.9  0.39
11        dfw,154       7    0.   0.3    4.3    8.21  163.3
12        vab,64.5      8    1.   32.3   11     2.1   21.3
12        avf,542       2    0.   2.12   28.2   8.12  57.5
12        vjg,35        4    1.   5.7    8.64   7.46  0.25
13        vaw,424.2     4    1.   64.3   0.435  4.3   35.3
14        bda,243       1    0.   4.4    4.6    2.4   4.2
15        rbe,24.2      3    1.   43     53.5   4.4   8.5

我想,对于每一行,计算从rdu 1到rdu 5的值的方差(它们是双倍的)。id和state\u id唯一标识一行。所需输出如下:

ID        state_id     act  rd_1 rd_2    rd_3   rd_4  rd_5.   var_rd
11        abc,13.3      1    1.   31     17.4   32.4  0.4    192.6624
11        afd,23.2      4    1.   42.1   1.3    31.9  0.39   323.3181
11        dfw,154       7    0.   0.3    4.3    8.21  163.3  4109.9855
12        vab,64.5      8    1.   32.3   11     2.1   21.3   141.3463
13        vaw,424.2     4    1.   64.3   0.435  4.3   35.3   636.2333
14        bda,243       1    0.   4.4    4.6    2.4   4.2    3.0496
15        rbe,24.2      3    1.   43     53.5   4.4   8.5    473.2456

我知道可以使用pivot展平数据,然后计算展平数据中列的方差(rd_值)。但是我使用的sql不支持pivot方法。我试着使用union,但它似乎把用户id弄乱了。

flmtquvp

flmtquvp1#

我将通过应用方差公式来解决这个问题:

select t.*,
       ( (rd_1 - rd_avg) * (rd_1 - rd_avg) +
         (rd_2 - rd_avg) * (rd_2 - rd_avg) +
         (rd_3 - rd_avg) * (rd_3 - rd_avg) +
         (rd_4 - rd_avg) * (rd_4 - rd_avg) +
         (rd_5 - rd_avg) * (rd_5 - rd_avg) +
       ) as variance 
from (select t.*, 
             (rd_1 + rd_2 + rd_3 + rd_4 + rd_5) / 5 as rd_avg
      from t
     ) t

相关问题