我有一张表:
我必须按照v
字段差异的平均值来排序行。
例如:
所有f1:
v1= 1;
v2 = 10;
v3 = 451;
average(f1) = ((abs(1-10))+(abs(10-451)))/3;
average(f2) = ....
因此我必须在后代模式下按此平均值排序。
可以使用一个SQL查询吗?有人能帮助我吗?
答案 0 :(得分:5)
您不必计算所有值之间的差异,您只需知道最小值,最大值和值数。
如果你看一下这些值:
( 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)
。