HOW TO GENERATE ROW NUMBER IN SQL WITHOUT ROWNUM ?
Generating a row number – that is a running sequence of numbers for each
row is not easy using plain SQL. In fact, the method I am going to show below
is not very generic either. This method only works if there is at least one
unique column in the table. This method will also work if there is no single
unique column, but collection of columns that is unique. Anyway, here is the
query:
SELECT name, sal, (SELECT
COUNT(*) FROM EMPLOYEE i WHERE o.name
>= i.name) row_num
FROM EMPLOYEE o
order by row_num
NAME
|
SAL
|
ROW_NUM
|
Anno
|
80
|
1
|
Bhuti
|
60
|
2
|
Darl
|
80
|
3
|
Hash
|
100
|
4
|
Inno
|
50
|
5
|
Meme
|
60
|
6
|
Pete
|
70
|
7
|
Privy
|
50
|
8
|
Robo
|
100
|
9
|
Tomiti
|
70
|
10
|
The column that is used in the row number generation logic is called
“sort key”. Here sort key is “name” column. For this technique to work, the
sort key needs to be unique. We have chosen the column “name” because this
column happened to be unique in our Employee table. If it was not unique but
some other collection of columns was, then we could have used those columns as
our sort key (by concatenating those columns to form a single sort key).
Also notice how the rows are sorted in the result set. We have done an
explicit sorting on the row_num column, which gives us all the row numbers in
the sorted order. But notice that name column is also sorted (which is probably
the reason why this column is referred as sort-key). If you want to change the
order of the sorting from ascending to descending, you will need to change
“>=” sign to “<=” in the query.
As I said before, this method is not very generic. This is why many
databases already implement other methods to achieve this. For example, in
Oracle database, every SQL result set contains a hidden column called ROWNUM.
We can just explicitly select ROWNUM to get sequence numbers.
No comments:
Post a Comment