SQL Server2005杂谈(3):四个排名函数(row_number、rank、dense_rank和ntile)的比较
2009-02-06 10:20:49 来源:WEB开发网2.所有桶中的记录要么都相同,要么从某一个记录较少的桶开始后面所有捅的记录数都与该桶的记录数相同。也就是说,如果有个桶,前三桶的记录数都是10,而第4捅的记录数是6,那么第5桶和第6桶的记录数也必须是6。
根据上面的两个约定,可以得出如下的算法:
//mod表示取余,div表示取整
if(记录总数mod桶数==0)
{
recordCount=记录总数div桶数;
将每桶的记录数都设为recordCount
}
else
{
recordCount1=记录总数div桶数+1;
intn=1; // n表示桶中记录数为recordCount1的最大桶数
m=recordCount1*n;
while(((记录总数-m) mod (桶数- n)) !=0)
{
n++;
m=recordCount1*n;
}
recordCount2=(记录总数-m)div (桶数-n);
将前n个桶的记录数设为recordCount1
将n+1个至后面所有桶的记录数设为recordCount2
}
根据上面的算法,如果记录总数为59,桶数为5,则前4个桶的记录数都是12,最后一个桶的记录数是11。
如果记录总数为53,桶数为5,则前3个桶的记录数为11,后2个桶的记录数为10。
就拿本例来说,记录总数为6,桶数为4,则会算出recordCount1的值为2,在结束while循环后,会算出recordCount2的值是1,因此,前2个桶的记录是2,后2个桶的记录是1。
系列文章:
SQL Server2005杂谈(1):使用公用表表达式(CTE)简化嵌套SQL
SQL Server2005杂谈(2):公用表表达式(CTE)的递归调用
SQL Server2005杂谈(3):四个排名函数(row_number、rank、dense_rank和ntile)的比较
- ››sql server自动生成批量执行SQL脚本的批处理
- ››sql server 2008亿万数据性能优化
- ››SQL Server 2008清空数据库日志方法
- ››sqlserver安装和简单的使用
- ››SQL Sever 2008 R2 数据库管理
- ››SQL SERVER无法安装成功,sqlstp.log文件提示[未发...
- ››Sql Server中通过父记录查找出所有关联的子记录
- ››SqlServer触发器、存储过程和函数
- ››SQL Server 中的事务(含义,属性,管理)
- ››Sqlite数据库插入和读取图片数据
- ››Sql server 2005拒绝了对对象 'xx表' (数...
- ››Sql server 2005拒绝了对对象 'xx表' (数...
更多精彩
赞助商链接