Search code examples
sql-serverdatabaset-sqlwindow-functions

Generate DENSE_RANK() without using order by clause - SQL Server


I am total new to SQL Server, can anyone guide me on my query it will very helpful for me.

I need to generate rank like in this example:

Report No               Rank 
----------------------------
18  3229                 1
89-0119-87               2
180261292                3
180261292                3
18  3107                 4
18A 7     A06            5
T18002415                6
T18002415                6
T18002415                6
0000000018-519           7
0000000018-519           7
0000000018-519           7
0000000018-519           7
0000000018-655           8
000000018-1002           9
000000018-1002           9
000000018-1002           9
000000018-5712           10

If I am generating rank using

DENSE_RANK() OVER(ORDER BY ReportNo DESC)

then I'm not getting the required output. Can you please guide me. How can I generate rank as in the above example?


Solution

  • Try this:

    DECLARE @Tab TABLE(Report_No VARCHAR(100))
    
    INSERT INTO @Tab VALUES('18  3229')
    INSERT INTO @Tab VALUES('89-0119-87')
    INSERT INTO @Tab VALUES('180261292')
    INSERT INTO @Tab VALUES('180261292')
    INSERT INTO @Tab VALUES('18  3107')
    INSERT INTO @Tab VALUES('18A 7     A06')
    INSERT INTO @Tab VALUES('T18002415')
    INSERT INTO @Tab VALUES('T18002415')
    INSERT INTO @Tab VALUES('T18002415')
    INSERT INTO @Tab VALUES('0000000018-519')
    INSERT INTO @Tab VALUES('0000000018-519')
    INSERT INTO @Tab VALUES('0000000018-519')
    INSERT INTO @Tab VALUES('0000000018-519')
    INSERT INTO @Tab VALUES('0000000018-655')
    INSERT INTO @Tab VALUES('000000018-1002')
    INSERT INTO @Tab VALUES('000000018-1002')
    INSERT INTO @Tab VALUES('000000018-1002')
    INSERT INTO @Tab VALUES('000000018-5712')
    
    SELECT *
        ,ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) RN
    INTO #temp
    FROM @Tab T1
    
    SELECT T1.Report_No
        ,SUM(CASE WHEN T1.Report_No = T2.Report_No THEN 0 ELSE 1 END) OVER(ORDER BY T1.rn)[Rank]
    FROM #temp T1
    LEFT JOIN #temp T2 ON T1.rn = T2.rn+1
    
    DROP TABLE #temp
    

    Output:

    Report_No       Rank
    18  3229        1
    89-0119-87      2
    180261292       3
    180261292       3
    18  3107        4
    18A 7     A06   5
    T18002415       6
    T18002415       6
    T18002415       6
    0000000018-519  7
    0000000018-519  7
    0000000018-519  7
    0000000018-519  7
    0000000018-655  8
    000000018-1002  9
    000000018-1002  9
    000000018-1002  9
    000000018-5712  10