[英]Group Item by Sum of a column
我對SQL Server查詢有疑問
我有一個表dbo.[Files]
,其列Id
, FileName
, FileSize(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.