如何基于GROUP BY从SQL Server获取行

时间:2012-04-21 08:40:53

标签: sql sql-server sql-server-2008

如何从前2个包ID中获取行而不是SQL Server中的所有行?

Ex:Sample_table

tranid   packid referencenum
1         1      123456
2         1      654982
3         2      894652
4         3      684521
5         3      684651
6         4      987566

根据上面的示例表,如何获取下一个实例的包2(1和2)的行我再次需要3行和4行

有人可以帮我解决问题吗?

3 个答案:

答案 0 :(得分:1)

如果我没有错过任何内容,请:

SELECT * 
FROM PacksTable p
WHERE p.Id IN (1, 2)

只会为您提供表格中两个pack_id的数据。

目前还不清楚你在寻找什么。您可以按pack_id进行分组,然后获得前两个pack_id,但是您想对分组referencenum的分组pack_id值做什么,即您将使用哪个汇总函数用于此列,MinMax等?? ??。

换句话说:如果您正在寻找Top最小pack_id,即第一次使用1,2,则必须回答以下问题:使用什么聚合函数与相应的referencenum值,

例如,您可以像这样使用MIN

SELECT TOP(2) p.packid, MIN(p.referencenum)
FROM PacksTable p
GROUP BY(p.packid)
ORDER BY p.packid

答案 1 :(得分:0)

请完成以下查询。

select * from sample_table group by packid;

答案 2 :(得分:0)

您可以使用与DENSE_RANK功能相结合的变量来一次浏览两个packid:

create table #packing (tranid int,packid int,referencenum int)
insert into #packing values 
  (1,1,123456)
, (2,1,654982)
, (3,2,894652)
, (4,3,684521)
, (5,3,684651)
, (6,4,987566)
go

declare @i int=-1;
declare @j int=0;

while @@ROWCOUNT>0 begin
    set @i+=2;
    set @j+=2;
    ; with a as (
        select *, dr=dense_rank()over(order by packid) from #packing
    )
    select tranid, packid, referencenum 
    from a 
    where dr between @i and @j;
end
go

drop table #packing
go

结果:

enter image description here