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.
Advertisement
Answer
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 JOIN
s/UNION ALL
…