簡體   English   中英

如何從SQL oracle中的平均值中排除某些值

[英]How do I exclude certain values from an average in SQL oracle

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

我正在尋找價格低於其他所有產品的平均價格的產品。 假設我有item 1 ,那么我將其與項目2-5的平均值而不是項目1-5的平均值進行比較。 我知道這將是一個相關的子查詢,但是我無法弄清楚平均值。 那么,如何從平均值中排除非特定項目?

編輯 :通過@ 1010的變換證明,我們只能將商品價格與總平均值進行比較。

智能解決方案:

提供與直接操作相同的結果,但是在大數據上執行得更快

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

簡單的解決方案:

這可以解決問題,但是,目前我還看不到優化它的方法(這是“執行計划的殺手”)

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

假設我的商品價格為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)

因此,只需將每個價格與所有價格的平均值進行比較即可。 一樣的。

編輯

按照基里爾的建議,這是另一個使價格低於平均價格的查詢

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM