Sql 按列的和对项进行分组

Sql 按列的和对项进行分组,sql,sql-server,Sql,Sql Server,我对SQL Server查询有疑问 我有一个表dbo.[Files],其中包含Id、FileName、FileSizeMB列 我的要求是,我必须以最大文件大小限制分组,并为文件大小总和小于或等于最大限制的组提供组号 假设最大文件大小总和为10 示例结果: Id FileName FileSize(MB) GroupNo -------------------------------------- 1 aa.gif 3 1 2 bb

我对SQL Server查询有疑问

我有一个表dbo.[Files],其中包含Id、FileName、FileSizeMB列

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

假设最大文件大小总和为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 
组中文件大小的总和为10

最终结果要求

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

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

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

我做了很多尝试,但最后我不得不接受一个过程性的解决方案,尽管是用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

可以在

欢迎使用StackOverflow中找到一个工作示例:如果您发布代码、XML或数据示例,请在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码示例”按钮{},以很好地格式化和语法突出显示它!那么你也不需要那些乱七八糟的标签了!!只是一个问题,你需要哪一个结果,第一个还是第二个?您是否也尝试过任何查询?您可能会发现昨天的问题与此相关:什么决定分组?有很多可能的组合可以让你得到10MB或更少…?这个问题没有显示任何研究成果。嗯,我很确定问题是关于如何将ID分组,而不仅仅是如何从第二个表中获得第三个表。在他最后的评论中,他说他的要求是最后的结果集。起初,我还认为需求是如何将ID分组。让我们看看用户要说什么@CarlSaldanhaI我不确定您使用的是哪个数据库。您也可以参考此链接@Rageshmk表没有GroupNo列。我没有GroupNo,我必须借助文件大小创建GroupNo。MSSQL中不支持和LISTAGG
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