簡體   English   中英

按列總和對項目分組

[英]Group Item by Sum of a column

我對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 

我做了很多嘗試,但是最后我不得不解決一個過程解決方案,盡管在T-SQL中。 以下腳本適用於臨時表@t1 (列: id, fn, size, gr ),必須首先將數據復制到其中。 另外,您也可以在原始表中附加一個group-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中找到

您能否檢查下面的查詢是否獲取了所需的輸出:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM