所以,我从这里学到了大约101,https://www.postgresqltutorial.com/postgresql-window-function/

在开始介绍窗口函数这一节之前,先简要介绍一下第100101子句.

以下是我根据教程使用的参考表:

enter image description here enter image description here

据我所知,第100条和第101条应该使用相同的字段.例如:

SELECT p.group_id, avg(p.price)  from PRODUCTS p GROUP BY p.group_id;

否则,PostgreSQL会给出一个错误: column "" must appear in the GROUP BY clause or be used in an aggregate function.

但是,我对以下查询的结果感到有点困惑:

select group_name,avg(price) from product_groups inner join products p using (group_id) group by group_id;

首先,我在SELECT和GROUP BY中使用不同的列,即分别为group_namegroup_id.但是,它不会抛出类似于上面的错误!

并且,它给出了以下结果.看起来group_namegroup_id在这里可以互换使用.谁能解释一下这是怎么回事吗?

enter image description here

推荐答案

你对GROUP BY的规则的理解已经完成了almost.一般来说,SELECT子句中出现的任何列也必须出现在GROUP BY中.然而,在ANSI标准中有一个例外,它规定如果GROUP BYuniquely中的一列确定其他列的值,那么这些其他列也可以出现在SELECT子句中.

仔细查看您的第二个查询:

SELECT group_name, AVG(price)           -- valid, because if we know
FROM product_groups                     -- group_id then we also know
INNER JOIN products p USING (group_id)  -- group_name
GROUP BY group_id;

products表中,如果group_id是主键或唯一键,那么如果我们为group_id Select 一个特定值,我们也唯一地知道group_name将是什么.如果是这样,那么从技术上讲,您的第二个查询是符合ANSI的.与大多数其他数据库相比,postgres更倾向于严格遵循ANSI标准,因此它接受您的查询是有效的.

Postgresql相关问答推荐

在Haskell中定义新类型与持久化类型的惯用方法

使用pg_repack从PostgreSQL中的表中删除OID

select语句的Jooq代码生成

Gorm 中的更新将created_at、updated_at 作为默认时间

在 postgres/presto/AWS-Athena 中,与 array_agg( (col1, col2) ) 相反的是什么来获得每组多行?

JPA findBy 字段忽略大小写

Django + Postgres + 大时间序列

使用 Django + Postgres 的加密策略?

postgres 和 python

如何使用 pg_dump 或 psql 从 *.sql 恢复 PostgreSQL 表?

并发刷新materialized视图

无法使用 sequelize 从本地 node 应用程序连接到 heroku postgresql 数据库

设置 Phoenix 框架和 Ecto 以使用 UUID:如何插入生成的值?

PostgreSQL 中的行编号

将数据推送到 Heroku 时出错:time zone displacement out of range

PostGIS - 将多面体转换为单面体

带有偏移限制的 Select 查询太慢了

为什么是||在 PostgreSQL/Redshift 中用作字符串连接

使用 Spring、Hibernate 和 C3P0 管理多租户 Web 应用程序中的连接池

如何在不丢失openproject数据的情况下将postgresql数据库从10升级到12