首页 > 解决方案 > Microsoft SQL Server:仅返回每个唯一 ID 具有最近日期的行

问题描述

我有一些数据有一个DeviceID列、一个扫描时间列和一些其他列。

对于每个设备 ID,我只想根据扫描时间返回最近的行。

我正在尝试创建此查询,以便可以将其用作数据视图和报告。

该数据库是 Microsoft SQL Server 数据库,我正在从 SQL Server 2014 Management Studio 运行查询。

我最接近让它工作的是:

SELECT
    DeviceID,
    AVSolutionName, 
    DefinitionsUpToDate,
    ScanningEnabled,
    Expired, 
    ScanTime
FROM 
    dbo.fact_AVSecurity
WHERE 
    (ScanTime IN (SELECT DISTINCT MAX(ScanTime) AS LastScan
                  FROM dbo.fact_AVSecurity AS Avs
                  GROUP BY DeviceID))

不幸的是,这会为同一个 ID 返回多个值。

ScanTime        ScanningEnabled Expired    DeviceID DefinitionsUpToDate   AVSolutionName
10/12/2018 10:13    TRUE             FALSE      15994             TRUE    Webroot SecureAnywhere
4/12/2018 14:30     TRUE             TRUE       15994             TRUE    Webroot SecureAnywhere

我想要返回的只是最近的第一行:

ScanTime        ScanningEnabled Expired    DeviceID DefinitionsUpToDate   AVSolutionName
10/12/2018 10:13    TRUE             FALSE      15994             TRUE       Webroot SecureAnywhere

我尝试了不同的方法,例如: SQL - Returning only the most recent row

但似乎无法让他们工作。我不确定这是否是我做错了,或者我使用的特定品牌的 SQL 没有做到“前 1”的事情。

有没有办法做我所追求的?我与我所拥有的有多接近?

标签: sqlsql-serversql-server-2012

解决方案


使用带有 CTE 的窗口函数?

With CTE AS (
SELECT t.DeviceID
     , t.AVSolutionName
     , t.DefinitionsUpToDate
     , t.ScanningEnabled
     , t.Expired
     , t.ScanTime
     , Row_Number() over (partition by DeviceID order by scanTime Desc) RN
FROM dbo.fact_AVSecurity t)
SELECT * 
FROM CTE 
WHERE RN=1 

推荐阅读