2016-03-01 24 views
0

我有一个表拆分SQL结果与最大尺寸组= N

id | volume_id| ... | 
----+----------+-----+ 
    1 |  1 | ... | 
    2 |  2 | ... | 
    3 |  1 | ... | 
    4 |  3 | ... | 
    5 |  2 | ... | 
    ... 

我可以做一个简单的分组查询:

select volume_id, count(*), min(id) as min_id, max(id) as max_id 
from my_table 
group by volume_id; 

将产生的结果:

volume_id | count | min_id | max_id  
-----------+-------+--------+-------- 
     1 | 67330 | ... | ... 
     2 | 67330 | ... | ... 
     3 | 67330 | ... | ... 
     4 | 67330 | ... | ... 

但我想将结果拆分为40K行的组。所以结果应该是这样的:

volume_id | count | min_id | max_id  
-----------+-------+--------+-------- 
     1 | 40000 | ... | ...  <- first group of IDs for volume 1 
     1 | 27330 | ... | ...  <- second group of IDs for volume 1 
     2 | 40000 | ... | ... 
     2 | 27330 | ... | ... 
     3 | 40000 | ... | ... 
     4 | 27330 | ... | ... 

的ID应该被拆分,使max_id第一组的应该是从第二组等比min_id小。

如果任何人有想法如何编写这样的查询(如果没有其他方式,或者plsql函数),我将不胜感激。

我正在使用Postgresql 9.5。

回答

1

您可以使用rank()(或row_number()如果没有重复项)来枚举组。然后简单的算术在group by

select volume_id, count(*), min(id) as min_id, max(id) as max_id 
from (select t.*, 
      rank() over (partition by volume_id order by id) as seqnum 
     from my_table t 
    ) t 
group by volume_id, floor((seqnum - 1)/40000) 
order by volume_id, min(id); 
+0

哇,好节奏!只有小小的改进:应该是'*'而不是't。*'。旁边的作品很棒! –