over()函数
over不能单独使用,要和分析函数:rank(),dense_rank(),row_number()等一起使用。
其参数:over(partition by columnname1 order by columnname2)
含义:按columname1指定的字段进行分组排序,或者说按字段columnname1的值进行分组排序。
例如:employees表中,有两个部门的记录:department_id =10和20
select department_id,rank() over(partition by department_id order by salary) from employees就是指在部门10中进行薪水的排名,在部门20中进行薪水排名。如果是partition by org_id,则是在整个公司内进行排名。
以下是个人见解:
sql中的over函数和row_numbert()函数配合使用,可生成行号。可对某一列的值进行排序,对于相同值的数据行进行分组排序。
执行语句:select row_number() over(order by AID DESC) as rowid,* from bb
rank()函数
RANK()函数为结果集的分区中的每一行分配一个排名。行的等级由一加上前面的等级数指定
RANK() OVER (
PARTITION BY <expression>[{,<expression>...}]
ORDER BY <expression> [ASC|DESC], [{,<expression>...}]
)
partition by 作为分区,可以不进行分区。
例:不加分区
例:加分区
通俗的讲就是:对于用到GROUP BY的select语句,查出来的列必须是group by后面声明的列,或者是聚合函数里面的列
有这样一个数据库的表
select语句:select id, sum(appr_id) from appr group by id------------------------------------(合法)
select语句:select id, user_id, sum(appr_id) from appr group by id-------------------------(合法)
select语句:select id, sum(appr_id) from appr group by role----------------------------------(不合法)
select语句:select id, user_id, sum(appr_id) from appr group by role-----------------------(不合法)
select语句:select * from appr group by role-------------------------------------------------------(不合法)
经过大量测试:笔者发现了ONLY_FULL_GROUP_BY这种模式的特点:
1:只要有聚合函数sum(),count(),max(),avg()等函数就需要用到group by,否则就会报上面的错误。
2:group by id(id是主键)的时候,select什么都没有问题,包括有聚合函数。
3:group by role(非主键)的时候,select只能是聚合函数和role(group by的字段),否则报错