Q:

Combine select top 1 SQL Statements

I have 4 select statements:
SELECT top 1 software, auditDate, versionNumber FROM table1 where software = 'software1' order by auditDate desc
SELECT top 1 software, auditDate, versionNumber FROM table1 where software = 'software2' order by auditDate desc
SELECT top 1 software, auditDate, versionNumber FROM table1 where software = 'software3' order by auditDate desc
SELECT top 1 software, auditDate, versionNumber FROM table1 where software = 'software4' order by auditDate desc

Currently, each select statement returns a table with one row like this:
   software  | auditDate  | versionNumber
1| software1 | 8/22/2017  | 5.0

If the top 1 condition wasn't there, then the result table would have more rows of the same software with different auditDate and versionNumber, but I only needed the most recent record (auditDate) for each software.
I'd like to roll all these select statements into one query that returns a table similar to this:
   software  | auditDate  | versionNumber
1| software1 | 8/22/2017  | 5.0
2| software2 | 8/20/2017  | 5.3
3| software3 | 8/21/2017  | 4.9
4| software4 | 8/16/2017  | 5.6

where each row is the same as the individual select top 1 statement above.
A UNION doesn't seem to work because of the order by clause and I'm stumped  for other solutions.

A:

You can use ROW_NUMBER:
WITH CTE AS
(
    SELECT  *,
            RN = ROW_NUMBER() OVER(PARTITION BY software ORDER BY auditDate DESC)
    FROM dbo.table1
    WHERE software IN ('software1','software2','software3','software4')
)
SELECT *
FROM CTE
WHERE RN = 1;

A:

Another Option is using the WITH TIES clause
Select top 1 with ties 
       software, auditDate, versionNumber 
 From  table1 
 Where software IN ('software1','software2','software3','software4')
 Order By Row_Number() over (Partition By software Order By auditDate Desc)

