当我在www.example.com上练习SQL时,我遇到了一个在特定行上没有意义的解决方案.你可以在下面的链接中看到这个问题:

https://pgexercises.com/questions/aggregates/rankmembers.html

解决方案查询如下所示,它工作,但我不能真正理解它如何不会引发错误,由于错误的GROUP BY用法:

select firstname, surname, hours, rank() over (order by hours desc) from
    (select firstname, surname,
        ((sum(bks.slots)+10)/20)*10 as hours

        from cd.bookings bks
        inner join cd.members mems
            on bks.memid = mems.memid
        group by mems.memid
    ) as subq
order by rank, surname, firstname;

没有代表我点击的是:为什么在GROUP BY中不包括名字和姓氏会导致错误?据我所知,GROUP BY必须包括我们显示的所有非聚合列才能工作.这是因为我们通过唯一标识每一列的主键JOIN,从而不知何故否定了在GROUP BY语句中包含显示列的必要性吗?

推荐答案

您的猜测是完全正确的:PK唯一标识行,事情不可能比唯一更独特.如果memid是唯一的,则字段与任何其它字段101的任何组合也将是唯一组合.

请注意,它只适用于primary key,虽然unique not null在这个意义上是一样的,但group by不会有同样的react .不管join怎么样,它都能正常工作.Demo.

来自PostgreSQL GROUP BY documentation(强调我的):

当存在GROUP BY或存在任何聚合函数时,SELECT列表表达式引用聚合函数或when the ungrouped column is functionally dependent on the grouped columns内的未分组列except是无效的,因为否则将有多于一个的可能值返回未分组列.如果分组列(或其子集)是包含未分组列的表的primary key,则存在函数依赖性.

Sql相关问答推荐

Oracle SQL对列进行汇总并在列表底部显示总计

将SEMI JOIN、ANTI JOIN转换为非连接SQL

无效和不匹配的计数

如何在幂函数中正确使用Power()和Exp()

如何在不更改S代码的情况下,判断存储过程调用了多少次clr函数?

计算周时出现SQL错误结果

在Oracle SQL中将列值转换为行

根据Rails活动记录中时间戳/日期时间的时间部分从PostgreSQL中提取记录

SQL Athena/prest判断值是否在嵌套的json数组中

仅在日期相隔时递增(Oracle SQL)

从JSON值数组创建扁平数组Athena

同时插入和更新记录

如何根据创建日期查找两个表中最接近的记录?

通过ID和数据找到每个不同的值

每组使用平均值来填补缺失值的SQL

批量更改WooCommerce中所有产品的税收状态

函数调用作为插入值语句中的参数

来自 SQL Server 的树层次 struct 图的 JSON

SQL Server Where 条件

如何根据 ID 和指标从 2 个表中找到不同的值?