在sql中按顺序获取输出

在sql中按顺序获取输出,sql,oracle12c,Sql,Oracle12c,我有一列col1,col2在表中,col3可以在表中,也可以是一个虚拟列,这是我的数据 COL1 COL2 0 1 3 1 5 1 7 1 8 1 10 1 0 2 21 2 23 2 25 2 26 2 28 2 0 3 39 3 0 4 如何通过在列中动态生成(

我有一列col1,col2在表中,col3可以在表中,也可以是一个虚拟列,这是我的数据

COL1    COL2
0         1
3         1
5         1
7         1
8         1
10        1
0         2
21        2
23        2
25        2
26        2
28        2
0         3
39        3
0         4
如何通过在列中动态生成(1,2,3..)来获得预期的操纵数据?如果列2中的值发生变化,则COL1中的值将为0,则序列应从(1,2..)开始:-

--DDL:-


您可以在此处使用Oracle
ROW\u NUMBER()
分析函数。但是,因为您希望行号从零开始,所以减去一,因为默认情况下,
row\u NUMBER()
是以一为基础的

select
    COL1,
    COL2,
    row_number() over (partition by col2 order by col2) - 1 as col3
from TEST_A

您可以在此处使用Oracle
ROW\u NUMBER()
分析函数。但是,因为您希望行号从零开始,所以减去一,因为默认情况下,
row\u NUMBER()
是以一为基础的

select
    COL1,
    COL2,
    row_number() over (partition by col2 order by col2) - 1 as col3
from TEST_A

蒂姆已经给出了最好的答案。但有一个问题:是否可以保证,对于COL2中的每个固定值,COL1中相应的值总是不同的?如果没有,预期的结果是什么?Tim提供的是一种选择;另外两个可以使用RANK()或稠密的_RANK()函数而不是ROW_NUMBER来实现。如果COL2中的每个固定值的COL1值始终不同,则所有三个函数将产生相同的结果。(在“关系”的情况下,另一个选择是通过另一列中的值“打破关系”。)Tim已经给出了最佳答案。但有一个问题:是否可以保证,对于COL2中的每个固定值,COL1中相应的值总是不同的?如果没有,预期的结果是什么?Tim提供的是一种选择;另外两个可以使用RANK()或稠密的_RANK()函数而不是ROW_NUMBER来实现。如果COL2中的每个固定值的COL1值始终不同,则所有三个函数将产生相同的结果。(在“关系”的情况下,另一个选项是通过另一列中的值“打破关系”。)
select
    COL1,
    COL2,
    row_number() over (partition by col2 order by col2) - 1 as col3
from TEST_A