如何从SQL oracle

时间:2015-04-24 03:32:09

标签: sql oracle average

如果我有这张表:Item(ItemID, descr, onhand, price)

我正在寻找低于其他所有平均价格的价格。因此,假设我有item 1,那么我会将其与项2-5的平均值进行比较,而不是项1-5的平均值。我知道这将是一个相关的子查询,但我无法弄清楚平均值。那么如何从平均值中排除非特定项?

2 个答案:

答案 0 :(得分:1)

编辑:正如@ 1010' s变换所证明,我们可以将商品价格与总平均价格进行比较。

智能解决方案:

提供与直接相同的结果,但在大数据上执行速度更快

SELECT 
    t.ItemId,
    t.descr,
    t.onhand,
    t.price
from Item t
JOIN (
SELECT AVG(price) AS price
FROM Item 
) item_avg ON t.price < item_avg.price

直截了当的解决方案:

然而,这是诀窍,目前我无法看到优化​​它的方法(它是一个&#34;执行计划杀手&#34;)

SELECT 
    t.ItemId,
    t.descr,
    t.onhand,
    t.price
from Item t
WHERE t.price < (
  SELECT AVG(T2.price) 
  FROM Item t2 
  WHERE t2.ItemId <> t.ItemID
)

对于具有此类值的表:

ItemId  descr   onhand  price   CalculatedAverage
1       desc1   1       23      40
2       desc2   1       5       44.5
3       desc3   1       100     20.75
4       desc4   1       35      37
5       desc5   1       20      40.75

它产生以下输出

ItemId  descr   onhand  price
1       desc1   1       23
2       desc2   1       5
4       desc4   1       35
5       desc5   1       20

答案 1 :(得分:1)

让我们说项目我有价格p_i,那么你想检查

p_i < (p_1 + ... + p_i-1 + p_i+1 + ... + p_n)/(n-1)

但它相当于

      p_i * (n-1) < (p_1 + ... + p_n) - p_i

p_i * (n-1) + p_i < (p_1 + ... + p_n)

  p_i * (n-1 + 1) < (p_1 + ... + p_n)

    (p_i * n) / n < (p_1 + ... + p_n) / n

              p_i < AVG(p)

所以只需将每个价格与所有价格的平均值进行比较。它是一样的。

修改

Kirill's建议后,另一个问题是让价格低于平均水平

SELECT ItemID, descr, onhand, price
  FROM Item
 WHERE price < (SELECT AVG(price) FROM Item)