结合选择前1个SQL语句

Cur*_*One 2 sql t-sql sql-server union ssms

我有4个选择语句:

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
Run Code Online (Sandbox Code Playgroud)

目前,每个select语句都返回一个包含一行的表,如下所示:

   software  | auditDate  | versionNumber
1| software1 | 8/22/2017  | 5.0
Run Code Online (Sandbox Code Playgroud)

如果top 1条件是不存在,那么结果表将有不同的同一软件的多个行auditDateversionNumber,但我只需要最近的记录(auditDate每个软件).

我想将所有这些select语句转换为一个返回类似于此的表的查询:

   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
Run Code Online (Sandbox Code Playgroud)

其中每一行与select top 1上面的单个语句相同.

A UNION因为该order by条款似乎不起作用,我很难为其他解决方案.

Lam*_*mak 6

你可以使用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;
Run Code Online (Sandbox Code Playgroud)


Joh*_*tti 6

另一个选项是使用WITH TIES子句

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)
Run Code Online (Sandbox Code Playgroud)