SQL;函数和where子句

时间:2014-02-13 10:18:36

标签: sql database postgresql where

我正在试图找出哪个国家的人口最接近全球平均国家人口。

我有以下关系;

   Column   |         Type          | Modifiers 
------------+-----------------------+-----------
 name       | character varying(35) | not null
 code       | character varying(4)  | not null
 capital    | character varying(35) | 
 province   | character varying(35) | 
 area       | numeric               | 
 population | numeric               | 

我尝试过这样做,我只需选择名称,国家/地区的人口,获得平均国家/地区人口,然后将其与where子句进行比较。最后,我只想设置一个限制1来获得所需的结果。奇怪的是,我不能这样做,我做错了什么?我正在使用PostgreSQL。

select name, population, avg(population) as gac 
from country 
where population <= avg(population);

错误;错误:WHERE子句中不允许聚合 第1行:... pulation)作为人口&lt; = avg(人口...

)的国家的gac

2 个答案:

答案 0 :(得分:2)

您可以按一个国家/地区的人口与总平均值之间的最小差异进行排序

select name, population, population, 
       (select avg(population) from country) as gac
from country 
order by abs(population - (select avg(population) from country)) 

最后一行执行以下操作:

  • 从国家/地区表中获取平均人口

    select avg(population) from country
    
  • 从当前国家(当前行)的人口中减去平均人口

    population - (select avg ...)
    
  • 获取该计算的绝对值 - 将负值反转为正值

    abs(...)
    
  • 按计算顺序排列。它从与平均人口差异最小的人群开始

答案 1 :(得分:1)

我可能会使用window函数:

select
    name, population, population
from 
    country 
order by
    abs(population - avg(population) over())
limit 1

或具有全球平均值的cross-joined个国家/地区:

select
    name, population, population
from 
    country 
    cross join (select avg(population) gac from country) gac
order by
    abs(population - gac.gac)
limit 1