如何在SQL中仅查询数据库中的旧数据和重复数据

时间:2019-03-28 16:29:49

标签: sql ms-access

我正在尝试查询数据库以仅提取重复/旧数据以写入excel的草稿区(使用将SQL传递给数据库的宏)。

就目前而言,我目前仅在Access中进行测试以仅过滤掉旧数据。

首先,我试图通过指定的WorkOrder,RunNumber和Row来过滤数据库。

下面的代码仅按工作订单,运行编号和行过滤。 ...但是当我使用第二个AND语句时,SQL不喜欢;因此目前无法使用。

SELECT *
FROM DataPoints
WHERE (((DataPoints.[WorkOrder])=[WO2]) AND ((DataPoints.[RunNumber])=6) AND ((DataPoints.[Row]=1)

一旦我找出那部分.​​..。

然后,如果只有1个条目具有指定的WorkOrder,RunNumber和Row,那么我想将其过滤掉。 (在草稿部分不需要,因为它的数据已经写到报告的主要部分)

如果有2个或更多具有上述条件的条目(WO,RN和行),那么我想根据RunDate和RunTime筛选出最新的条目,而只保留所有较旧的条目。

例如,在下面的剪辑中。我过滤的查询中剩余的唯一项目将是时间戳为11:47:00 AM的顶部条目。

Sample data snippet

有没有推荐的命令来解决此问题?任何想法都是有帮助的。谢谢。

2 个答案:

答案 0 :(得分:0)

代码段的末尾还需要两个)。或者,您可以在此示例中完全删除括号,MS Access会视需要将其重新添加。

硕士Access SQL可能很棘手,因为它不符合标准,或者不允许进行超复杂的查询,或者需要进行一些丑陋的处理,例如在尝试连接两个以上的表时遇到了括号嵌套的噩梦。

由于这些原因,我建议使用多个Access查询来产生结果。

答案 1 :(得分:0)

我会建议以下内容:

select t.* 
from datapoints t 
where 
    t.workorder = [WO2] and 
    t.runnumber = 6 and 
    t.row = 1 and
    exists
    (
        select 1 
        from datapoints u 
        where 
            u.workorder = t.workorder and
            u.runnumber = t.runnumber and
            u.row = t.row and
            (u.rundate > t.rundate or (u.rundate = t.rundate and u.runtime > t.runtime))
    )

在这里,如果where子句中的相关子查询找到具有相同的workorderrunnumberrow,但后一个{{1} }或相同的rundate和更高版本的rundate,然后记录由主查询返回。