2017-03-27 7 views
0

私はOracleデータベース10gを使用しています。データのグループに固有のリスト番号を割り当てる

私はクライアントの要件の1つのロジック実装で立ち往生しています。

私たちは、テーブル内のデータを以下している::

id cust_nbr item_id  
--------------------- 
1  A  10 
2  A  11 
3  A  12 
4  B  10 
5  B  11 
6  B  12 
7  C  11 
8  C  12 
9  C  13 
10  C  14 

は期待出し::

id cust_nbr item_id list_nbr 
--------------------------------------- 
1  A  10  1 
2  A  11  1 
3  A  12  1 
4  B  10  1 
5  B  11  1 
6  B  12  1 
7  C  11  2 
8  C  12  2 
9  C  13  2 
10  C  14  2 

を私たちは、別の顧客を持っているすべての同じ項目に独自のリスト番号を割り当てます。

ここから分かるように、10,11,12は2つの顧客(A、B)に割り当てられているため、この2つの顧客には1が割り当てられています。 item_id 11,12,13,14は1人の顧客(C)に割り当てられているため、この顧客にはlist_nbr 2が割り当てられています。

sqlを使用してこの変更を実装する方法が見つかりません。

このデータは単なる例です。この表には何千もの記録があります。

この問題を理解してもらえますか?

ありがとうございました。

答えて

0

編集:私はこの回答を残していますが、10gではなくOracle 11gに適用されます。 listagg()wm_concat()に置き換えることはできますが、グループ内のはこの解決策にとって重要です。

listagg()を使用して値をまとめて値を割り当てます。だから、顧客が、これは次のようになります。

select cust_nbr, listagg(item_id, ',') within group (order by item_id) as items 
from t 
group by cust_nbr; 

あなたはdense_rank()を使用して一意の値を割り当てることができます。

select cust_nbr, 
     listagg(item_id, ',') within group (order by item_id) as items, 
     dense_rank() over (order by listagg(item_id, ',') within group (order by item_id)) as list_nbr 
from t 
group by cust_nbr; 

次に、あなたのデータに、このバックに参加することができます。

with l as (
     select cust_nbr, 
      listagg(item_id, ',') within group (order by item_id) as items, 
      dense_rank() over (order by listagg(item_id, ',') within group (order by item_id)) as list_nbr 
     from t 
     group by cust_nbr 
    ) 
select t.*, l.list_nbr 
from t join 
    l 
    on t.cust_nbr = l.cust_nbr; 
+0

LISTAGG( )が11gで導入された。 OPは彼らが@APCの – APC

+0

10gを使用していると言います。 。 。私はその質問にタグを付け加えました。 –

関連する問題