SQL Server - 查找在过去30天内出现过3次的记录

时间:2014-01-06 22:41:19

标签: sql sql-server

如果之前已经回答过,我道歉,但我看着我知道如何找不到它的各种方式。

我有一个每周报告表,如下所示:[pcname],[pcnumber],[用户名],[日期]

我正在尝试检索[pcname]在过去30天内重复3次的记录。由于这些是每周出场次数,在过去4周内意味着3次。每条记录应该显示一次,或重复3次,我可以稍后在excel中过滤它(我稍后会担心报告和格式化,只是现在尝试获得一个有效的查询)。我尝试的一切都会得到结果,其中一些行有重复(当然除了日期)但有些行没有。它们应该都是重复的,或者都没有。如果[pcname]相同但可能有多个外观,但用户名不是,但如果每个列但日期相同,则应该是所有内容中的3个或所有内容中的1个,除非其中一个列发生更改当然不是[pcname]或[date]。目前我看似随机重复(每个列但[日期]相同),我无法弄清楚原因。

对于背景:该表是由pc security发出的每周报告。列表中显示的所有内容都不合规。但是,我们没有解决清单上的所有问题,因为事情在一两天内不合规,然后一直自行解决。因此,我们只需要在过去4周内违反规定的违规者,让我们知道PC是一个有问题的孩子。

到目前为止我的SQL查询是:

SELECT  
    [pcname],
    [Username],
    [column], --from server2
    [column], --from server2
    [column], --from server3
    [column], --from server3
    [DATE] 


FROM [server1].database.schema.table1 
    LEFT JOIN [server2].database.schema.table2 ON Usernamet1 = Usernamet2 
    LEFT JOIN [server3].database.schema.table3 ON table2.[column] = table3.[column]

WHERE [DATE] >= DATEADD(day, DATEDIFF(day, 0, GETDATE()) -28, 0) 
    AND [pcname] IN (SELECT [pcname] FROM [server1].database.schema.table1 GROUP BY [pcname] HAVING COUNT(*) = 3)
--WHERE [DATE] >= DATEADD(Day, -60, getdate())
GROUP BY [DATE], [pcname], [Username], [column1], [column2], [column3], [column4] 
--HAVING COUNT([pcname]) >= 3 

正如你所看到的,我留下了我注释掉的其他方法,万一你发现它们很有用。如果您需要更多信息,请与我们联系。我在SQL Server 2008工作。

1 个答案:

答案 0 :(得分:1)

您的查询已关闭,但您不应按DATE字段进行分组,因为这是多次发生的字段。

SELECT  
    [pcname],
    [Username],
    [column1], 
    [column2], 
    [column3], 
    [column4]


FROM [server1].database.schema.table1 
    LEFT JOIN [server2].database.schema.table2 ON Usernamet1 = Usernamet2 
    LEFT JOIN [server3].database.schema.table3 ON table2.[column] = table3.[column]

WHERE [DATE] >= DATEADD(day, DATEDIFF(day, 0, GETDATE()) -28, 0) 
GROUP BY [pcname], [Username], [column1], [column2], [column3], [column4] 
HAVING COUNT(*) >= 3