将列的值与该列SQL的平均值进行比较

时间:2017-07-24 07:20:14

标签: sql database postgresql performance

我有一张桌子

CREATE TABLE t (
  id INTEGER PRIMARY KEY NOT NULL DEFAULT,
  country CHARACTER VARYING(40),
  city CHARACTER VARYING(40),
  population NUMERIC(10,6) DEFAULT NULL::numeric
);

我想要的是从人口少于人口平均数的表中获得国家,城市。

就像我有数据一样

id | country | city     | population
1  | US      | New York | 250
2  | US      | dalas    | 150
3  | UK      | london   | 300
4  | UK      | york     | 100

平均人口为200,因此查询应列出US, dalasUK, york作为答案。

2 个答案:

答案 0 :(得分:0)

尝试此查询:

select * FROM T
where populuation< (SELECT AVG(population) FROM T)

答案 1 :(得分:0)

另一个可能表现更好的选择是使用CTE和Window函数,以及基于其输出的过滤器。

 WITH base_data as (SELECT t, avg(population) 
                              OVER (range unbounded preceding) as average
                      FROM t)
 SELECT (t).* from base_data where t.population < average;

您不必像我一样将行和聚合数据分开(将表类型选为字段并在过滤后的查询中将其展开),事实上,如果您不介意返回平均值,您也可以:

 WITH base_data as (SELECT *, avg(population) 
                              OVER (range unbounded preceding) as average
                      FROM t)
 SELECT * from base_data where t.population < average;