Oracle SQL:从重复记录中筛选超过30天未扫描的电脑名
解决Oracle中基于最新扫描日期筛选未扫描电脑的问题
你的原查询错误返回最近已扫描系统的核心原因是:只要某台电脑存在一条符合report_week >= SYSDATE -7且last_scan_date < SYSDATE-30的旧记录,就会被纳入结果,完全忽略了该电脑可能存在的更新扫描记录。要解决这个问题,必须先获取每台电脑的最新扫描日期,再基于这个日期进行判断。
以下是两种适配Oracle环境的可行方案:
方案1:分组聚合获取最新扫描日期
通过GROUP BY按电脑名称分组,用MAX()函数提取每台电脑的最新扫描日期和最新报告周,再筛选符合条件的记录:
SELECT computer_name FROM ( SELECT computer_name, MAX(last_scan_date) AS latest_scan_date, MAX(report_week) AS latest_report_week FROM scan_table GROUP BY computer_name ) WHERE latest_report_week >= SYSDATE - 7 AND latest_scan_date < SYSDATE - 30;
方案2:窗口函数筛选最新记录
使用ROW_NUMBER()窗口函数为每台电脑的记录按扫描日期降序排序,取排序后的第一条(即最新记录),再进行条件筛选:
SELECT computer_name FROM ( SELECT computer_name, last_scan_date, report_week, ROW_NUMBER() OVER (PARTITION BY computer_name ORDER BY last_scan_date DESC) AS rn FROM scan_table ) WHERE rn = 1 AND report_week >= SYSDATE - 7 AND last_scan_date < SYSDATE - 30;
方案特点说明
- 方案1性能更优,适合仅需电脑名称的场景,聚合操作在大数据量下效率更高。
- 方案2可以保留最新扫描记录的所有字段,方便后续扩展查询需求(比如查看最新扫描的详细信息)。
内容的提问来源于stack exchange,提问作者Neodreadlord
相关产品推荐
相关产品推荐

