可以使用row_number()
,或rank()
與over(partition by personId order by personId)
select personId,
row_number() over(partition by personId order by personId) Sequence_Number
from your_table
編輯:如果要排序的正是像你提到的期望的輸出結果,你需要做的order by rownum
兩次,以保證所需的排序:
select personId,
row_number() over(partition by personId order by rownum) Sequence_Number
from your_table
order by rownum
下面是上面查詢檢查:
SQL> create table your_table (personId int);
Table created.
SQL> insert all
2 into your_table values(32)
3 into your_table values(45)
4 into your_table values(32)
5 into your_table values(67)
6 into your_table values(45)
7 into your_table values(45)
8 select * from dual;
6 rows created.
SQL> commit;
Commit complete.
SQL> select personId,
2 row_number() over(partition by personId order by rownum) Sequence_Number
3 from your_table;
PERSONID SEQUENCE_NUMBER
---------- ---------------
32 1
32 2
45 1
45 2
45 3
67 1
6 rows selected.
SQL> select personId,
2 row_number() over(partition by personId order by rownum) Sequence_Number
3 from your_table
4 order by rownum;
PERSONID SEQUENCE_NUMBER
---------- ---------------
32 1
45 1
32 2
67 1
45 2
45 3
6 rows selected.
SQL> drop table your_table;
Table dropped.
SQL>
你可以簡單地做'ORDER BY NULL'或'ORDER BY rownum'在這種情況下 - 我會用'ROW_NUMBER()''以上RANK()'的情況下,有另一列的OP要用於訂購。 –
@DavidFaber,只有一次按rownum命令,不能保證所需的排序,OP需要在'over()'部分執行'兩次'一個命令,另一個在查詢結束時執行,但是感謝你的評論,回答編輯。 – jfun
對,我建議'ORDER BY rownum'只在所需的'ORDER BY'子句中有* something *。我不知道是否有OP的一部分是否需要。 –