sql - 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”的事情。
有没有办法做我所追求的?我与我所拥有的有多接近?
解决方案
使用带有 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
推荐阅读
- php - 将 PDF 作为附件发送以进行离线同步
- c++ - 如何终止 DLL 中的 log4cplus?
- python - 使用 tcsh 包装器收集 python 覆盖
- function - 更改整个 react-native 应用程序的语言
- swift - 如何使用swift在Macosx App中执行launchctl load start?
- javascript - 当我单击它时,Framework 7 Accordion 不显示,我知道问题出在 JS 文件上吗?
- arrays - 如果条件满足,Arrayformula 获取上述单元格的值
- python - 使用 pytorch 对给定张量进行洗牌的矢量化方法
- sql - 在 PostgresSQL 和 Oracle 中,具有多个 OR 的 where 条件下的 4000 个输入会影响查询性能
- windows - 见证客户端注册见证服务器失败