为数据组分配唯一列表编号

assign unique list number to group of data

我正在使用 oracle 数据库 10g。

我卡在客户需求的一种逻辑实现中。

我们在 table 中有以下数据 ::

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

我们想为拥有不同客户的所有相同项目分配唯一列表编号。

如您所见,item_id 10、11、12 分配给了 2 个客户(A、B),因此 list_nbr 1 分配给了这 2 个客户。 item_id 11,12,13,14 仅分配给 1 个客户 (C),因此 list_nbr 2 分配给该客户。

我找不到任何方法来使用 sql 来实施此更改。

这个数据只是一个例子。这个table.

会有几千条记录

你能帮我解决这个问题吗?

谢谢。

编辑:我要留下这个答案,但它适用于 Oracle 11g,而不是 10g。您可以尝试将 listagg() 替换为 wm_concat(),但组内的 order by 对于此解决方案很重要。

一种方法是使用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;