SQL over关键字(转载)
2011-02-16 09:39 爱研究源码的javaer 阅读(1844) 评论(0) 编辑 收藏 举报1.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,则是在整个公司内进行排名
2.不是over,是Rank() over ,具体语法形如: RANK ( ) OVER ( [query_partition_clause] order_by_clause ) DENSE_RANK ( ) OVER ( [query_partition_clause] order_by_clause ) 可实现按指定的字段分组排序,对于相同分组字段的结果集进行排序, 其中PARTITION BY 为分组字段,ORDER BY 指定排序字段
http://www.cnblogs.com/mywebworld/archive/2009/10/20/1586844.html
http://space.cnblogs.com/q/22345/
INSERT INTO student_class_grade VALUES(13,2,80); INSERT INTO student_class_grade VALUES(14,2,80); INSERT INTO student_class_grade VALUES(15,2,90); INSERT INTO student_class_grade VALUES(16,2,75); INSERT INTO student_class_grade VALUES(17,2,100);
sql server2005中我们可以用简单的一个语句完成这个任务partition by 后面跟聚合列,如下:
select student_id,class_no,grade ,class_avg_grade = AVG(grade) over(partition by class_no) from student_class_grade
若是在2000中,我们不得不使用子查询,查询要复杂一些
select scg.student_id ,scg.class_no ,scg.grade ,t_avg. class_avg_grade from student_class_grade scg INNER JOIN (select class_no,class_avg_grade = AVG(grade) from student_class_grade group by class_no) t_avg ON t_avg.class_no = scg.class_no
同样其他聚合函数SUM,COUNT,MAX,MIN也可以使用类似用法。
文章出处:飞诺网(www.firnow.com):http://dev.firnow.com/course/7_databases/sql/sqlServer/2008617/125662_2.html