oracle SQL -如何从日期列中的最新日期超过30天的重复记录中选择记录

uklbhaso  于 2023-04-05  发布在  Oracle
关注(0)|答案(2)|浏览(173)

我正在尝试运行一个查询,该查询从一个表中选择任何计算机名,该表满足30天内未扫描的条件。理论上,SYSDATE - 30是理想的,但这里的挑战是每个系统可能有重复的条目。
因此,在下面的查询中,我从一个表中选择计算机,其中报告周是本周,而上次扫描是在30多天前。因为此系统本周有多个条目,所以它返回在30天内进行过扫描的系统。因为一个记录显示本周已扫描,而另一个记录显示未扫描。

SELECT DISTINCT
  computer_name
FROM
  scan_table st
WHERE
  report_week >= SYSDATE - 7
AND
  st.last_scan_date < SYSDATE - 30

它返回x system,即使x system是昨天扫描的,因为重复的记录表明x system上次扫描是在2月。
是的,显而易见的答案是从数据库中清除重复的数据,但这不是一个选项,所以我需要一种方法来根据last_scan_date列中可用的最新日期进行过滤。
我尝试使用MAX(st.last_scan_date),但是不允许在WHERE子句中使用它。我看到建议使用SELECT子查询的结果,但是,这只是将这个问题带回。除非我错误地使用子查询
我使用的是ORACLE SQL DEVELOPER。

lsmepo6l

lsmepo6l1#

如果您的目标是report_weeklast_scan_date的最新值,则可以使用聚合并在HAVING子句中设置条件:

SELECT computer_name
FROM scan_table 
GROUP BY computer_name
HAVING MAX(report_week) >= SYSDATE - 7 AND MAX(last_scan_date) < SYSDATE - 30;
dojqjjoe

dojqjjoe2#

您可以使用exists来过滤掉同一台计算机以前的扫描。

SELECT 
    computer_name,
    last_scan_date
FROM
    scan_table st
WHERE
    report_week >= SYSDATE - 7
    AND st.last_scan_date < SYSDATE - 30
    AND NOT EXISTS (
        select
            1
        from
            scan_table st2
        where
            st.computer_name = st2.computer_name
            and st2.last_scan_date > st.last_scan_date
    )

此外,您还可以看到实际的最后扫描日期。

相关问题