mysql group by兼容写法FIRST_ROW
从mysql迁移库,存在非聚集列不在group by 的语句。
这样的sql会被认为是不合法的sql,因为:
1,order by后面的列必须是在select后面存在的
2,select、having或order by后面存在的非聚合列必须全部在group by中存在
通用情况下,mysql可以通过以下三种方式解决报错问题
1,修改sql使其遵守only_full_group_by规则
2,关闭only_full_group_by规则
3,降级数据库版本在5.7以下
对于迁移数据,仅有一种选择(即修改sql,使其符合 非聚集列在group by 语句中),为非聚集列加上常用min(),max()等聚集函数,当然这将导致结果集与之前的mysql有差异,如果客户希望保留原有结果集,我们也可以通过创建自定义聚集函数的方式,返回非取集列返回第一行的写法。
如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | DROP FUNCTION IF EXISTS my_first_row_init; CREATE dba FUNCTION my_first_row_init (dummy varchar (255)) RETURNING varchar (255) with ( not variant); RETURN '##FIRSTROW##' ; END FUNCTION ; DROP FUNCTION IF EXISTS my_first_row_iter; CREATE dba FUNCTION my_first_row_iter (result varchar (255), value varchar (255)) RETURNING varchar (255) with ( not variant); if result[1,12] = '##FIRSTROW##' then return value; else return result; end if; END FUNCTION ; DROP FUNCTION IF EXISTS my_first_row_combine; CREATE dba FUNCTION my_first_row_combine(partial1 varchar (255), partial2 varchar (255)) RETURNING varchar (255) with ( not variant); RETURN '' ; END FUNCTION ; DROP aggregate if exists first_row; create aggregate first_row with ( INIT = my_first_row_init, ITER = my_first_row_iter, COMBINE = my_first_row_combine ); |
示例:
1 2 3 | SELECT col1,first_row(col2) FROM tab11 GROUP BY col1; |
col2返回分组的第一行。
- 上一篇: GBase 8s数据库用户登陆验证大致过程
- 下一篇: 获取干支纪年的函数