为数据组分配唯一列表编号
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;
我正在使用 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;