Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用序列创建组ID_Sql_Oracle_Sequence - Fatal编程技术网

Sql 使用序列创建组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

我正在尝试基于一组项目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       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;
否则,您需要其他列来确定项目的正确顺序