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条件是不存在,那么结果表将有不同的同一软件的多个行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
Run Code Online (Sandbox Code Playgroud)
其中每一行与select top 1上面的单个语句相同.
A UNION因为该order by条款似乎不起作用,我很难为其他解决方案.
你可以使用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)
另一个选项是使用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)
| 归档时间: |
|
| 查看次数: |
1071 次 |
| 最近记录: |