[英]How do I write SQL query for average?
最近參加了SQL的面試,問題如下:
編寫查詢以檢索城市名稱、state 名稱、城市人口並返回以下計算結果以及上述字段。
城市表:
城市名稱 | State_NAme | 人口 |
---|---|---|
巴爾的摩 | 馬里蘭州 | 30000 |
大學公園 | 馬里蘭州 | 18000 |
哥倫比亞 | 馬里蘭州 | 20000 |
波士頓 | 馬薩諸塞州 | 35000 |
馬爾登 | 馬薩諸塞州 | 10000 |
多佛 | 特拉華州 | 20000 |
Jersey 城市 | 新Jersey | 35000 |
我試過下面的查詢,但沒有得到所需的 output。任何人都可以幫助我進行正確的查詢嗎?
select * from city_table;
select state_name, sum(population)/count(city_name) as average_city_pop
from city_table
group by state_name;
您需要進一步探索 sql,了解聚合函數和連接。 您的查詢在獲取平均人口方面是正確的。 您需要將它加入到原始表中以獲得結果。
with avg_city_pop as (select state_name, avg(population) as avg from city group by state_name)
select c.*, acp.avg as average_city_population, abs(acp.avg-c.population) as difference from city c inner join avg_city_pop acp on c.state_name = acp.state_name;
對於8.0之前的MySQL版本,我們可以使用相關子查詢得到每個state的平均人口,也可以用來計算城市人口與state平均人口的差距。 請注意,可選地使用abs
function 始終返回正數。 如有必要,請省略它。
select city_name,state_name,(select avg(population) from city where state_name=c.state_name group by state_name ) as average_pop ,
abs(population - (select avg(population) from city where state_name=c.state_name group by state_name )) as gap_pop
from city c;
select
city_name,
state_name,
population,
avg(population) over (partition by state_name) as Avg_pop,
population-avg(population) over (partition by state_name) as Difference
from city;
參見 sqlfilldle: https://www.db-fiddle.com/f/tVxdH6bQvsu48umWgLmrQB/0
這需要 MySQL 8.0+,因為over_clause
從 8.0 開始可用。
output:
城市名稱 | 州名 | 人口 | 平均流行 | 區別 |
---|---|---|---|---|
多佛 | 特拉華州 | 20000 | 20000.0000 | 0.0000 |
巴爾的摩 | 馬里蘭州 | 30000 | 22666.6667 | 7333.3333 |
大學公園 | 馬里蘭州 | 18000 | 22666.6667 | -4666.6667 |
哥倫比亞 | 馬里蘭州 | 20000 | 22666.6667 | -2666.6667 |
波士頓 | 馬薩諸塞州 | 35000 | 22500.0000 | 12500.0000 |
模具 | 馬薩諸塞州 | 10000 | 22500.0000 | -12500.0000 |
jersey 城市 | 新 jersey | 35000 | 35000.0000 | 0.0000 |
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.