结合选择前1个SQL语句

时间:2017-08-22 15:23:34

标签: sql sql-server tsql ssms union

我有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

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

   software  | auditDate  | versionNumber
1| software1 | 8/22/2017  | 5.0

如果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

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

由于UNION条款而导致order by似乎不起作用,而我却难以接受其他解决方案。

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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)

答案 2 :(得分:0)

假设您有一个id col并且不想为该软件命名,请使用以下内容:

选择*从((选择id,软件,max(auditDate)从table1组中按id,软件)a a left join table1 b on a.id = b.id)