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能执行,不会报错,而且得到了正确的数据。
仔细看了一下, 这个sql可以执行没有语法错误;
publish_time, template_id, location_id 这三个字段的值你确定是你想要的吗?
因为你sql是根据knowledge_versioned_id, operation_time分组的,相当于多条记录合并成一条,publish_time, template_id, location_id 这三个字段的值对应的是多条记录中的一条记录
这是SQL语法的规定,用了group by,则select之后的字段除聚合函数外都必须出现在group by中,你可以少于group by中的字段,但不能包含group by中没有的字段
你可以这么想一下,假如有个表Table1,它有三个字段A, B, C,数据如下:
A B C
1 1 1
1 1 2
1 2 1
对于前两行数据,你按A,B分组后,结果是一行,你没法儿确定是选择第一行还是第二行或者其它,所以如果select中要显示C,需要有一个聚合函数来得到唯一解,比如max, min, sum之类
groud by 分组 一次 统计一次