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)

テーブル内の2つのデータのみが表示pack_idされます。

ここで何を探しているのかは不明です。それからグループ化しpack_idて上位2つを取得できますが、groupedのグループ化された値をpack_idどのように処理しますか。つまり、この列に使用する集計関数、、、など??!。referencenumpack_idMinMax

言い換える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、一度に 2 つの 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 に答える