我有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
条件不存在,那么结果表将包含具有不同auditDate
和versionNumber
的相同软件的更多行,但我只需要最新记录(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
似乎不起作用,而我却难以接受其他解决方案。
答案 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)