Q1:使用Group By功能后,為什么每組最多只輸出一行?這是否意味著應該過濾組而不是過濾每個組中的記錄?
Q2 : 我想查找每個組中年齡大于該組平均年齡的記錄。我嘗試了以下方法,但它什么也沒回傳。我應該如何解決這個問題?
SELECT *, avg(age) FROM Mytable Group By country 年齡 > avg(age)
謝謝!!!!
uj5u.com熱心網友回復:
您可以計算子查詢中每個國家/地區的平均年齡,并將其連接到您的表中進行過濾:
SELECT mt.*, MtAvg.AvgAge
FROM Mytable mt
inner join
(
select mtavgs.country
, avg(mtavgs.age) as AvgAge
from Mytable mtavgs
group by mtavgs.country
) MTAvg
on mtavg.country=mt.country
and mt.Age > mtavg.AvgAge
對于列出的 GROUP BY 列中的每個唯一值組合,GROUP BY 始終回傳 1 行(前提是它們沒有被 HAVING 子句洗掉)。我們示例中的子查詢(別名:MTAvg)將計算每個國家的一行。我們將通過在 INNER JOIN 子句中應用條件來使用它的結果來過濾主表行;我們還將通過包括計算的平均年齡來報告該平均值。
uj5u.com熱心網友回復:
GROUP BY 是一個稱為聚合函式的關鍵字。在這里查看以進一步閱讀SQL Group By 教程
它的作用是將所有結果集中到一行中。在您的示例中,它將所有結果與同一個國家/地區合并在一起。
不太確定您的查詢到底需要什么才能解決您的確切問題。但是,我會研究 SQL 中所謂的視窗函式。我相信您首先需要做的是撰寫一個視窗函式來查找每個組的平均年齡。然后你可以寫一個查詢來回傳你需要的結果
uj5u.com熱心網友回復:
根據您的 dbms 型別和版本,您可以使用“視窗函式”來計算每個國家/地區的平均值,并且通過這種方法可以在每一行上進行計算。一旦該資料以“派生表”的形式出現,您就可以簡單地使用 where 子句來過濾大于每個國家/地區計算的平均年齡的年齡。
SELECT mt.*
FROM (
SELECT *
, avg(age) OVER(PARTITION BY country) AS AvgAge
FROM Mytable
) mt
WHERE mt.Age > mt.AvgAge
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/494091.html
標籤:sql
上一篇:獲得最高銷量
下一篇:如何根據上一行的條件創建ID列?
