SQL:在不使用 PIVOT 的情况下获取多列的方差
SQL: get variance for multiple columns without using PIVOT
我在 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
我想为每一行计算从 rd_1 到 rd_5 的值的方差(它们是双精度值)。 ID 和 state_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_value) 的方差。但是我使用的 SQL 不支持 Pivot 方法。我尝试使用 UNION 但它似乎与 user_id.
混淆了
我会通过应用方差公式来解决这个问题:
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
我在 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
我想为每一行计算从 rd_1 到 rd_5 的值的方差(它们是双精度值)。 ID 和 state_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_value) 的方差。但是我使用的 SQL 不支持 Pivot 方法。我尝试使用 UNION 但它似乎与 user_id.
混淆了我会通过应用方差公式来解决这个问题:
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