Help with ranking records within years

  • Hi,
    I need to create a report that shows that last time a person completed a course each year. I've figured out dense_rank() to the point where it will rank by date all the times a user completed a given course, but I can't rank within the year. If I could, then I'd just take the 1 rank in each year.
    Here's the SQL:

    SELECT dense_rank() over

           (

                  partitionby [user_id]

                  orderby [cplt_dt] desc

           ) AS Rank

          ,[cplt_dt] AS CompletionDate

          ,YEAR([cplt_dt]) AS YearCompleted

          ,[crse_cd] AS CourseCode

          ,[crse_nm] AS CourseName

          ,[user_id] AS UserID

          ,[last_nm] AS LastName

          ,[fst_nm] AS FirstName

    FROM [SQL_Svr].[dbo].[Training_RCD_VW]

    WHERE [crse_nm] LIKE '%records management%'AND [cplt_dt]>= '1/1/2009' AND [user_id]='XYZPDQ'

    ORDER BY UserID, CompletionDate desc


    This gives me:

    RankCompletionDateYearCompletedCourseCodeCourseNameUserIDLastNameFirstName
    19/19/17 0:002017RMT20172017 Records Management TrainingXYZPDQDOEJOHN
    212/8/16 0:002016RMRT201-5410532016 Records Management RefresheXYZPDQDOEJOHN
    212/8/16 0:002016RMRT2016-5411252016 Records Management Refresher TrainingXYZPDQDOEJOHN
    312/7/15 0:002015SS_XXU_RM_2016Records Management Refresher Training 2015XYZPDQDOEJOHN
    410/7/14 0:002014RMT2014-5247502014 Records Management TrainingXYZPDQDOEJOHN
    512/5/13 0:002013RMT2013-5156452013 Records Management TrainingXYZPDQDOEJOHN
    610/22/12 0:002012RMT2012-4982512012 Records Management TrainingXYZPDQDOEJOHN
    712/6/11 0:002011XX-YY-2012_REC-MGT-ANI2011 Records Management Annual Refresher Training (Animated Version)XYZPDQDOEJOHN
    712/6/11 0:002011XX_YY_RM_TRAININGV9Overview of Federal Records ManagementXYZPDQDOEJOHN
    812/1/11 0:002011XX-YY-2012_REC-MGT-TXT2011 Records Management Annual Refresher Training (Text Only Version)XYZPDQDOEJOHN
    812/1/11 0:002011XX-YY-2012_REC-MGT-TXT2011 Records Management Annual Refresher Training (Text Only Version)XYZPDQDOEJOHN
    812/1/11 0:002011XX-YY-2012_REC-MGT-ANI2011 Records Management Annual Refresher Training (Animated Version)XYZPDQDOEJOHN
    812/1/11 0:002011XX-YY-2012_REC-MGT-ANI2011 Records Management Annual Refresher Training (Animated Version)XYZPDQDOEJOHN
    812/1/11 0:002011XX-YY-2012_REC-MGT-TXT2011 Records Management Annual Refresher Training (Text Only Version)XYZPDQDOEJOHN
    99/1/11 0:002011XX_YY_RM_TRAININGV9Overview of Federal Records ManagementXYZPDQDOEJOHN
    108/12/11 0:002011XX_YY_RM_TRAININGV9Overview of Federal Records ManagementXYZPDQDOEJOHN
    1110/21/10 0:002010WW-RMRecords Management for All EmployeesXYZPDQDOEJOHN
    121/6/10 0:002010XX_YY_RM_TRAININGV9Overview of Federal Records ManagementXYZPDQDOEJOHN
    139/18/09 0:002009XX_YY_RM_TRAININGV9Overview of Federal Records ManagementXYZPDQDOEJOHN
    148/26/09 0:002009XX_YY_RM_TRAININGV9Overview of Federal Records ManagementXYZPDQDOEJOHN
    158/20/09 0:002009XX_YY_RM_TRAININGV9Overview of Federal Records ManagementXYZPDQDOEJOHN

    What I need is this:

    RankCompletionDateYearCompletedCourseCodeCourseNameUserIDLastNameFirstName
    19/19/17 0:002017RMT20172017 Records Management TrainingXYZPDQDOEJOHN
    112/8/16 0:002016RMRT201-5410532016 Records Management RefresheXYZPDQDOEJOHN
    212/8/16 0:002016RMRT2016-5411252016 Records Management Refresher TrainingXYZPDQDOEJOHN
    112/7/15 0:002015SS_XXU_RM_2016Records Management Refresher Training 2015XYZPDQDOEJOHN
    110/7/14 0:002014RMT2014-5247502014 Records Management TrainingXYZPDQDOEJOHN
    112/5/13 0:002013RMT2013-5156452013 Records Management TrainingXYZPDQDOEJOHN
    110/22/12 0:002012RMT2012-4982512012 Records Management TrainingXYZPDQDOEJOHN
    112/6/11 0:002011XX-YY-2012_REC-MGT-ANI2011 Records Management Annual Refresher Training (Animated Version)XYZPDQDOEJOHN
    112/6/11 0:002011XX_YY_RM_TRAININGV9Overview of Federal Records ManagementXYZPDQDOEJOHN
    212/1/11 0:002011XX-YY-2012_REC-MGT-TXT2011 Records Management Annual Refresher Training (Text Only Version)XYZPDQDOEJOHN
    212/1/11 0:002011XX-YY-2012_REC-MGT-TXT2011 Records Management Annual Refresher Training (Text Only Version)XYZPDQDOEJOHN
    212/1/11 0:002011XX-YY-2012_REC-MGT-ANI2011 Records Management Annual Refresher Training (Animated Version)XYZPDQDOEJOHN
    212/1/11 0:002011XX-YY-2012_REC-MGT-ANI2011 Records Management Annual Refresher Training (Animated Version)XYZPDQDOEJOHN
    212/1/11 0:002011XX-YY-2012_REC-MGT-TXT2011 Records Management Annual Refresher Training (Text Only Version)XYZPDQDOEJOHN
    39/1/11 0:002011XX_YY_RM_TRAININGV9Overview of Federal Records ManagementXYZPDQDOEJOHN
    48/12/11 0:002011XX_YY_RM_TRAININGV9Overview of Federal Records ManagementXYZPDQDOEJOHN
    110/21/10 0:002010WW-RMRecords Management for All EmployeesXYZPDQDOEJOHN
    21/6/10 0:002010XX_YY_RM_TRAININGV9Overview of Federal Records ManagementXYZPDQDOEJOHN
    19/18/09 0:002009XX_YY_RM_TRAININGV9Overview of Federal Records ManagementXYZPDQDOEJOHN
    28/26/09 0:002009XX_YY_RM_TRAININGV9Overview of Federal Records ManagementXYZPDQDOEJOHN
    38/20/09 0:002009XX_YY_RM_TRAININGV9Overview of Federal Records ManagementXYZPDQDOEJOHN

    How do I get there?
    Thanks,
    Erick

  • SELECT dense_rank() over

    (

    partitionby [user_id], YEAR([cplt_dt])

    orderby [cplt_dt] desc

    ) AS Rank

    ,[cplt_dt] AS CompletionDate

    ,YEAR([cplt_dt]) AS YearCompleted

    ,[crse_cd] AS CourseCode

    ,[crse_nm] AS CourseName

    ,[user_id] AS UserID

    ,[last_nm] AS LastName

    ,[fst_nm] AS FirstName

    FROM [SQL_Svr].[dbo].[Training_RCD_VW]

    WHERE [crse_nm] LIKE '%records management%'AND [cplt_dt]>= '1/1/2009' AND [user_id]='XYZPDQ'

    ORDER BY UserID, CompletionDate desc

    Try this.


  • Thanks!
    I did look around to see if you could add multiple partitions to dense_rank(), but didn't see it in the docs I could find.

  • Erick Emde - Tuesday, October 10, 2017 3:20 PM


    Thanks!
    I did look around to see if you could add multiple partitions to dense_rank(), but didn't see it in the docs I could find.

    If you just Google DENSE_RANK() you'll find Microsoft's documentation on it.

    Steve (aka sgmunson) 🙂 🙂 🙂
    Rent Servers for Income (picks and shovels strategy)

  • sgmunson - Wednesday, October 11, 2017 6:08 AM

    If you just Google DENSE_RANK() you'll find Microsoft's documentation on it.

    You're right, Steve. RTFD. I'm properly spanked. It's right there. On the OVER clause page, in the syntax section. You'd think at least one of the examples would show more than one field in the DENSE_RANK() or OVER doc pages.

  • Erick Emde - Wednesday, October 11, 2017 7:43 AM

    sgmunson - Wednesday, October 11, 2017 6:08 AM

    If you just Google DENSE_RANK() you'll find Microsoft's documentation on it.

    You're right, Steve. RTFD. I'm properly spanked. It's right there. On the OVER clause page, in the syntax section. You'd think at least one of the examples would show more than one field in the DENSE_RANK() or OVER doc pages.

    Well, ... wasn't really trying to spank anyone, but when you only look at examples, you only get limited info, because there's a direct link in that DENSE_RANK() page that sends you to the OVER clause documentation page here:    https://docs.microsoft.com/en-us/sql/t-sql/queries/select-over-clause-transact-sql

    And that page clearly indicates that multiple value expressions can appear in the PARTITION BY clause.
    Just need to be more thorough in looking at MS docs.

    Steve (aka sgmunson) 🙂 🙂 🙂
    Rent Servers for Income (picks and shovels strategy)

  • Oops!  accidental double post...

    Steve (aka sgmunson) 🙂 🙂 🙂
    Rent Servers for Income (picks and shovels strategy)

Viewing 7 posts - 1 through 7 (of 7 total)

You must be logged in to reply to this topic. Login to reply