Sql 使用序列创建组ID
我正在尝试基于一组项目ID创建组ID。项目标识是单个组的一部分的唯一指示是项目标识是连续的。例如,根据下面的前两列,我想要的输出是第三列:Sql 使用序列创建组ID,sql,oracle,sequence,Sql,Oracle,Sequence,我正在尝试基于一组项目ID创建组ID。项目标识是单个组的一部分的唯一指示是项目标识是连续的。例如,根据下面的前两列,我想要的输出是第三列: item item_id group_id ABC 282 2 ABC 283 2 ABC 284 2 ABC 285 2 ABC 051 3 ABC 052 3 ABC 189 4 ABC 231 5 ABC 232
item item_id group_id
ABC 282 2
ABC 283 2
ABC 284 2
ABC 285 2
ABC 051 3
ABC 052 3
ABC 189 4
ABC 231 5
ABC 232 5
ABC 233 5
ABC 234 5
ABC 247 6
ABC 248 6
ABC 249 6
ABC 250 6
ABC 091 7
ABC 092 7
组id本身不一定是连续的,它只需要是唯一的。我尝试使用以下代码执行此操作:
create sequence seq
start with 1
minvalue 1
increment by 1
cache 20;
select seq.nextval from dual; --to initialize the sequence
select
item,
item_id,
case when diff = 1 then seq.currval else seq.nextval end group_id
from
(
select
item,
item_id,
(id - lag(id, 1, 0) over (order by 1) diff
from
(
select
item,
item_id
from
table
)
);
但是得到以下输出:
item item_id group_id
ABC 282 2
ABC 283 3
ABC 284 4
ABC 285 5
ABC 051 6
ABC 052 7
ABC 189 8
ABC 231 9
ABC 232 10
ABC 233 11
ABC 234 12
ABC 247 13
ABC 248 14
ABC 249 15
ABC 250 16
ABC 091 17
ABC 092 18
在查找问题的原因时,我发现了用户ShannonSeverance提供的详细信息,说明了我的解决方案无法工作的原因。然而,它没有就如何向前发展提供任何建议
有人有什么想法吗?您有一个问题,因为SQL表本身就是无序的。以下“应该”在逻辑上起作用,但在实践中不会起作用:
select ii.*, (item_id - rownum) as grp_id
from item_ids ii;
按顺序减去行号的项目ID序列是常量。您可以将其用于组,至少用于给定的项目。要处理多个项目,请将这些值连接在一起:
select ii.*, item||'-'||(item_id - rownum) as grp_id
from item_ids ii;
要真正做到这一点,您需要添加一个orderby
——这保证了select
结果的顺序。假设组之间存在“洞”,这可能会起作用:
select ii.*, item||'-'||(item_id - rownum) as grp_id
from item_ids ii
order by item, item_id;
否则,您需要其他列来确定项目的正确顺序