Group By 多个字段 查询问题

2019-01-02 20:45发布

SQL如下:

SELECT knowledge_versioned_id, max( CASE WHEN type IN (4, 10) AND state = 10 THEN operator_id ELSE NULL END ) creator_id, max( CASE WHEN type IN (5) AND state = 10 THEN operator_id ELSE NULL END ) city_reviewer_id, max( CASE WHEN type IN (4, 10, 6) AND state = 10 THEN operator_id ELSE NULL END ) province_reviewer_id, max( CASE WHEN type IN (4, 10) AND state = 10 THEN operation_time ELSE NULL END ) operation_time, publish_time, template_id, location_id FROM knowledge_statistic WHERE state = 10 AND type IN (4, 5, 6, 10) GROUP BY knowledge_versioned_id, operation_time

为什么 group by后面是knowledge_versioned_id, operation_time,select 后面能跟除了这两个字段之外的非聚合字段publish_time, template_id, location_id?原则上groupby了之后搜索字段只能跟group by后面的字段和聚合函数吗?

确定的是这个sql能执行,不会报错,而且得到了正确的数据。

标签:
4条回答
刘海飞了
2楼-- · 2019-01-02 21:01

仔细看了一下, 这个sql可以执行没有语法错误;
publish_time, template_id, location_id 这三个字段的值你确定是你想要的吗?
因为你sql是根据knowledge_versioned_id, operation_time分组的,相当于多条记录合并成一条,publish_time, template_id, location_id 这三个字段的值对应的是多条记录中的一条记录

查看更多
孤独寂梦人
3楼-- · 2019-01-02 21:07

这是SQL语法的规定,用了group by,则select之后的字段除聚合函数外都必须出现在group by中,你可以少于group by中的字段,但不能包含group by中没有的字段

查看更多
冷夜・残月
4楼-- · 2019-01-02 21:13

你可以这么想一下,假如有个表Table1,它有三个字段A, B, C,数据如下:

A  B  C

1  1  1

1  1  2

1  2  1

对于前两行数据,你按A,B分组后,结果是一行,你没法儿确定是选择第一行还是第二行或者其它,所以如果select中要显示C,需要有一个聚合函数来得到唯一解,比如max, min, sum之类

查看更多
只若初见
5楼-- · 2019-01-02 21:21

groud by 分组 一次 统计一次

查看更多
登录 后发表回答