i have a sql query:
select id, name from table order by name
result looks like this:
52 arnold
33 berta
34 chris
47 dori
Assuming SQL 2005, you can use Row_Number
The answer depends on which version of SQL you are using.
If you are using MSSQL 2005 you can use the the new analytical function ROW_NUMBER () which generates the sequential number in order which we define in order by clause. The syntax of ROW_NUMBER () function is:
ROW_NUMBER () OVER (ORDER BY )
or
ROW_NUMBER () OVER (PARTITION BY )
If you are using an older version of SQL Server you can create a temp table with an identity column and select the results from that.
You don't mention which RDBMS you're running, but if you're using SQL Server 2005 or greater, you can employ the ROW_NUMBER() function - like this:
SELECT id, name, ROW_NUMBER() OVER (ORDER BY name) AS RowNumber
FROM MyTable
Then, to fetch a given row, you can use a derived table or a common table expression - like this:
;WITH NumberedRows
AS
(SELECT id, name, ROW_NUMBER() OVER (ORDER BY name) AS RowNumber
FROM MyTable)
SELECT RowNumber FROM NumberedRows WHERE id = 47
To sort out "which page" the record is on, you would need to divide the row number by the number of records per page, and round up to the nearest integer.
The previous posts are correct. Use ROW_NUMBER if using Microsoft SQL Server 2005 or greater.
However, your tags do not specify that you're using MSSQL, so here's a solution that should work across most RDBMS implementations. Essentially, use a correlated subquery to determine the count of rows in the same set that are less than the current row, based on the values of the ORDER clause of the outer query. Something like this:
SELECT T1.id,
T1.[name],
(SELECT COUNT(*)
FROM table T2
WHERE T2.[name] < T1.[name]) + 1 AS rowpos
FROM table T1
ORDER BY T1.[name]
use Row_Number