Search code examples
sqldistinct

sql query distinct with Row_Number


I am fighting with the distinct keyword in sql. I just want to display all row numbers of unique (distinct) values in a column & so I tried:

SELECT DISTINCT id, ROW_NUMBER() OVER (ORDER BY id) AS RowNum
FROM table
WHERE fid = 64

however the below code giving me the distinct values:

SELECT distinct id FROM table WHERE fid = 64

but when tried it with Row_Number.
then it is not working.


Solution

  • Use this:

    SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS RowNum FROM
        (SELECT DISTINCT id FROM table WHERE fid = 64) Base
    

    and put the "output" of a query as the "input" of another.

    Using CTE:

    ; WITH Base AS (
        SELECT DISTINCT id FROM table WHERE fid = 64
    )
    
    SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS RowNum FROM Base
    

    The two queries should be equivalent.

    Technically you could

    SELECT DISTINCT id, ROW_NUMBER() OVER (PARTITION BY id ORDER BY id) AS RowNum 
        FROM table
        WHERE fid = 64
    

    but if you increase the number of DISTINCT fields, you have to put all these fields in the PARTITION BY, so for example

    SELECT DISTINCT id, description,
        ROW_NUMBER() OVER (PARTITION BY id, description ORDER BY id) AS RowNum 
        FROM table
        WHERE fid = 64
    

    I even hope you comprehend that you are going against standard naming conventions here, id should probably be a primary key, so unique by definition, so a DISTINCT would be useless on it, unless you coupled the query with some JOINs/UNION ALL...