WEB开发网
开发学院数据库MSSQL Server SQL Server2005杂谈(3):四个排名函数(row_num... 阅读

SQL Server2005杂谈(3):四个排名函数(row_number、rank、dense_rank和ntile)的比较

 2009-02-06 10:20:49 来源:WEB开发网   
核心提示: 2.所有桶中的记录要么都相同,要么从某一个记录较少的桶开始后面所有捅的记录数都与该桶的记录数相同,SQL Server2005杂谈(3):四个排名函数(row_number、rank、dense_rank和ntile)的比较(5),也就是说,如果有个桶,因此,前2个桶的记录是2,前三桶的记

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)的比较

上一页  1 2 3 4 5 

Tags:SQL Server 杂谈

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接