如果之前已经回答过,我道歉,但我看着我知道如何找不到它的各种方式。
我有一个每周报告表,如下所示:[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工作。
答案 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