将列的值与该列 SQL 的平均值进行比较
Posted
技术标签:
【中文标题】将列的值与该列 SQL 的平均值进行比较【英文标题】:Compare a value of a column with mean of that column SQL 【发布时间】:2017-07-24 07:20:13 【问题描述】:我有一张桌子
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, dalas
和 UK, york
作为答案。
【问题讨论】:
【参考方案1】:试试这个查询:
select * FROM T
where populuation< (SELECT AVG(population) FROM T)
【讨论】:
【参考方案2】:另一个可能表现更好的选择是使用 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;
【讨论】:
以上是关于将列的值与该列 SQL 的平均值进行比较的主要内容,如果未能解决你的问题,请参考以下文章
如何将列的当前值与sql server和Oracle中同一列的先前值进行比较
将一个表中的值与另一表中具有相同属性的值的平均值计算进行比较