按列总和对项目进行分组

时间:2015-07-16 12:27:42

标签: sql sql-server

我对SQL Server查询有疑问

我有一个表dbo.[Files],其中列IdFileNameFileSize(MB)

Id   FileName   FileSize(MB)
----------------------------
1    aa.gif        3 
2    bb.gif        5 
3    cc.gif        7 
4    dd.gif        5 
5    ee.gif        2 
6    fff.gif       4 
7    gg.gif        3 

我的要求是,我必须以最大文件大小限制进行分组,并为文件大小小于或等于最大限制的组提供组号

假设最大文件大小总和为10

示例结果:

Id   FileName   FileSize(MB)   GroupNo
--------------------------------------
1    aa.gif         3             1 
2    bb.gif         5             1 
5    ee.gif         2             1 
3    cc.gif         7             2 
7    gg.gif         3             2 
4    dd.gif         5             3 
6    fff.gif        4             3 

组中FileSize的总和为10

需要最终结果

GroupNo  Ids
--------------
1        1,2,5 
2        4,6 
3        3,7 

2 个答案:

答案 0 :(得分:1)

我尝试了很多,但最后我不得不求助于程序解决方案,尽管在T-SQL中。以下脚本适用于必须首先复制数据的临时表@t1(列:id, fn, size, gr)。或者,您也可以为原始表配备一个额外的组ID列gr,然后在该表上工作。

declare @g int=1, @cnt int,@si int;
    -- group-no, row-count, size of group
select @cnt=count(*) from #t1 where gr=0;
while (@cnt>0) begin
select @si=isnull(sum(size),0) from #t1 where gr=@g;
update #t1 set gr=@g where id = (
 select top 1 id from #t1
 where gr=0 and @si+size<=10 
 order by @si+size desc);
 if (@@rowcount=0) begin
  if (@si=0) update top(1) #t1 set gr=@g 
             where gr=0; -- for files > 10mb
    set @g=@g+1;
  end;
  select @cnt=count(*) from #t1 where gr=0
end;

select * from #t1

可以在http://data.stackexchange.com/stackoverflow/query/337062/group-into-10mb-chunks-2

找到一个工作示例

答案 1 :(得分:0)

请检查以下查询是否正在获取所需的输出:

        Select 
        GroupNo,
        LISTAGG((id)|| ',' ORDER BY id)
        from your_table;