我有一张像这样的桌子:
v
我必须根据字段差异的平均值对行进行排序。
例如:
所有f1:
v1= 1;
v2 = 10;
v3 = 451;
average(f1) = ((abs(1-10))+(abs(10-451)))/3;
average(f2) = ....
所以我必须在后代模式下按这个平均值排序列。
有可能与一个 SQL 查询有关吗?有人能帮我吗?
我有一张像这样的桌子:
v
我必须根据字段差异的平均值对行进行排序。
例如:
所有f1:
v1= 1;
v2 = 10;
v3 = 451;
average(f1) = ((abs(1-10))+(abs(10-451)))/3;
average(f2) = ....
所以我必须在后代模式下按这个平均值排序列。
有可能与一个 SQL 查询有关吗?有人能帮我吗?
您不必计算所有值之间的差异,您只需要知道最小值、最大值和值的数量。
如果您查看这些值:
( abs(1-10) + abs(10-451) ) / 3
如果您总是从较大的值中减去较小的值,则不需要abs
:
( (10-1) + (451-10) ) / 3
不需要内括号,因此您得到:
(10 - 1 + 451 - 10) / 3
在这里您可以消除内在价值10
,就像您拥有+10
和一样-10
。你最终只得到最大和最小值:
(451 - 1) / 3
不管你有多少中间值,它们总是会被自己消除,例如(b-a)+(c-b)+(d-c)+(e-d)+(f-e)
= (f-a)
。
因此,用于此的 SQL 将是:
select name, (max(v) - min(v)) / count(*) as averageDiff
from TheTable
group by name
order by averageDiff desc
注意:我不确定这个平均差异应该是什么意思,但是您将平均差异除以项目数,但您可能希望将其除以差异数,即比数字少一物品;(count(*) - 1)
.