[英]MySQL, group by in both inner and outer query at the same time
進行如下查詢:
SELECT position, AVG(price) FROM products WHERE position IS NOT NULL
AND price < (SELECT AVG(price)+2*STDDEV(price) FROM price)
AND position = 3
如果您只想一次檢查一個職位,那很好,但是我有很多職位,因此我想同時獲取所有職位的數據。
即類似:
[QUERY]... GROUP BY position
但是如何在內部查詢和外部查詢中按位置分組,因此內部查詢where子句返回與正確位置匹配的值。
謝謝。
您正在尋找GROUP BY
。 要獲得每個頭寸的平均價格,而不僅僅是一個頭寸的平均價格,這就是您要做的。
SELECT position, AVG(price) average
FROM products
GROUP BY position
您的查詢中有兩個西格瑪排除。 您需要使用相同的技術來獲取每個頭寸的限制。 如果要計算每個位置的平均值+ 2 sigma限制,則需要此子查詢。 ( 注意 :最好在SQL之類的語言中使用括號,而不是信任算術運算符的優先級。)
SELECT position,
AVG(price) + (2.0 * STDDEV(price)) upper_limit
FROM products
GROUP BY position
然后,您可以像這樣將查詢加入您的頂級選擇中
SELECT a.position, a.price
FROM products
JOIN (
SELECT position,
AVG(price) + (2.0 * STDDEV(price)) upper_limit
FROM products
GROUP BY position
) b ON a.position = b.position
AND a.price < b.upper_limit
這樣就可以為您提供倉位/價格的原始數據(不包括異常值)。 您是否看到ON
子句如何按位置匹配主查詢和子查詢中的行,然后過濾掉原始價格高於upper_limit
? 那是訣竅。
然后,您可以使用典型的GROUP BY
聚合該數據。
SELECT a.position, AVG(a.price) average
FROM products
JOIN (
SELECT position,
AVG(price) + (2.0 * STDDEV(price)) upper_limit
FROM products
GROUP BY position
) b ON a.position = b.position
AND a.price < b.upper_limit
GROUP BY a.position
查詢中這種子查詢的分層就是為什么將其稱為結構化查詢語言。
不能添加GROUP BY
完成您想要的嗎?
SELECT position, AVG(price)
FROM products p
WHERE position IS NOT NULL AND
price < (SELECT AVG(price)+2*STDDEV(price)
FROM price p2
)
GROUP BY position;
或者,您是否在乎某個特定產品? 如果是這樣,則需要一個相關的子查詢:
SELECT position, AVG(price)
FROM products p
WHERE position IS NOT NULL AND
price < (SELECT AVG(price)+2*STDDEV(price)
FROM price p2
WHERE p.? = p2.?
)
GROUP BY position;
尚不清楚應使用哪個列進行關聯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.