0

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

例如: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 行

谁能帮我解决这个问题?

4

3 回答 3

1

如果我没有错过什么,这是:

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

只会给你表中两个的数据pack_id

目前尚不清楚您在这里寻找什么。您可以通过分组pack_id获得前两个pack_id,但是您想对分组的referencenum值做pack_id什么,即您将为此列使用什么聚合函数,,,Min等等Max??!。

换句话说:如果您在第一次寻找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
于 2012-04-21T09:05:02.207 回答
0

请通过以下查询。

select * from sample_table group by packid;
于 2012-04-21T09:04:26.197 回答
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

结果:

在此处输入图像描述

于 2012-04-21T20:01:25.670 回答