【问题标题】:SQL; Functions and where clauseSQL;函数和 where 子句
【发布时间】:2014-03-12 03:47:28
【问题描述】:

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

我有以下关系;

   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) 作为来自人口 的国家/地区的 gac

【问题讨论】:

    标签: sql database postgresql where


    【解决方案1】:

    您可以按一个国家的人口与总平均数之间的最小差异排序

    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(...)
      
    • 按该计算排序。它从与平均人口差异最小的人群开始

    【讨论】:

    • 感谢您的帮助!它似乎工作。但是最后一行实际上做了什么?我无法控制它。
    • 太棒了!再次感谢您。
    【解决方案2】:

    我可能会使用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
    

    【讨论】:

    • 第一个+我不知道的“over()”函数的使用是干净的f**k!太好了,我学到了很多,谢谢你的帮助!程序员联合起来! :)
    猜你喜欢
    • 1970-01-01
    • 2020-11-29
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    相关资源
    最近更新 更多