SQLServer查询窗口

时间:2015-02-06 06:11:27

标签: sql sql-server

我有一张如下表格

select 1 group_rank, 1 row_rank union all
select 1 , 2  union all
select 1 , 3  union all
select 1 , 4  union all
select 1 , 5  union all
select 2 , 1  union all
select 2 , 2  union all
select 2 , 3  union all
select 2 , 4  union all
select 2 , 5  union all
select 3 , 1  union all
select 3 , 2  union all
select 3 , 3  union all
select 3 , 4  union all
select 3 , 5  union all
select 4 , 1  union all
select 4 , 2  union all
select 4 , 3  union all
select 4 , 4  union all
select 4 , 5  

我想根据大小进一步打破row_rank。如果我的大小是2,则进一步拆分row_rank,如下所示。输出第三列应如下所示

select 1 group_rank, 1 row_rank, 1 batch_number union all
select 1 , 2, 1  union all
select 1 , 3, 2  union all
select 1 , 4, 2  union all
select 1 , 5, 3  union all
select 2 , 1, 4  union all
select 2 , 2, 4  union all
select 2 , 3, 5 union all
select 2 , 4, 5  union all
select 2 , 5, 6  union all
select 3 , 1, 7  union all
select 3 , 2, 7  union all
select 3 , 3, 8  union all
select 3 , 4, 8  union all
select 3 , 5, 9  union all
select 4 , 1, 10 union all
select 4 , 2, 10 union all
select 4 , 3, 11 union all
select 4 , 4, 11 union all
select 4 , 5, 12  

由于分割尺寸为2,

  

第一个group_rank中的前两行获得第一批编号,

     

第一个group_rank中的第三个第四行获得第二个批号,

     

第一行中的第五行group_rank获得第三批号,

     

第二个group_rank中的前两行获得第四个批号,

     第二个group_rank中的第三个第四行获得第五个批号,

     

第五行得到第3组_rank得到第6批号

......等等..

因为,我改变了分割尺寸,,批号应该相应地增大或缩小。 请提供我的sql server TSQL查询来执行此操作。

谢谢,

1 个答案:

答案 0 :(得分:0)

对我来说听起来像简单的数学,至少有一个基于0或基于1的伏都教:

  ((row_number() over (order by group_rank, row_rank) - 1) / @batch_size) + 1

SQL Fiddle demo

这是做什么的:

  • row_number() over (order by group_rank, row_rank):获取在整个集合中排序的行号,先由group_rank然后按row_rank
  • 排序
  • - 1:将行号设为0
  • / @batch_size:除以您想要的“批量大小”(整数除以最佳值)
  • + 1:将结果从1开始,以匹配您的输出