2017-03-23 7 views
0

私は6レコードのテーブルを持っており、それぞれ3行にグループ分けして結果を得る必要があります。ランク付けする方法/ SQLで3行ずつグループ化する

入力表:必要な

id  Value 
------------- 
1  abcd 
2  defgh 
3  ijkl 
4  mnop 
5  qrst 
6  uvwx 

出力フォーマット:

select dense_rank() over (order by (id - 1)/3) as grp, id, value 
from t; 

これはid開始であること、あなたのサンプルデータのように、想定しています

Rank id  Value 
-------------------- 
1  1  abcd 
1  2  defgh 
1  3  ijkl 
2  4  mnop 
2  5  qrst 
2  6  uvwx 
+0

値1と残りの半分を持って、あなたは何を試してみましたか? –

答えて

1

あなたはここにNTILE()を使用することができます。

SELECT NTILE(2) OVER(ORDER BY id),id FROM TABLE_NAME 

バケツとして考えて、NTILE(2)2つのバケツを行います、半分の行が値2

+0

必要に応じて正確に動作します – Sreedhar

2

ここでは一つの方法であります1であり、隙間なく増加する。

それが本当でない場合は、代替手段は次のとおりです。

select dense_rank() over (order by seqnum/3) as grp, id, value 
from (select t.*, row_number() over (order by id) - 1 as seqnum 
     from t 
    ); 
0

Idは何のギャップを持っていないし、1で始まる場合:

select (id + 2)/3 as [Rank], Id, Value 
from YourTable; 

しかし、Idはギャップがある場合は?例えば1、2、4、5、...
そして、窓関数ROW_NUMBER()これを修正することができます

select (row_number() over (order by id) + 2)/3 as [Rank], Id, Value 
from YourTable; 
関連する問題