符合特定条件的唯一行

时间:2018-02-01 02:28:05

标签: sql sql-server powershell tsql

我的数据是Microsoft Office 365邮箱审核日志。

我正在使用14列,包括名称,时间戳,IP地址等。

我有两张桌子,我们称之为现有。列定义,顺序和计数在两个表中是相同的。

现有中的数据是(非常接近!)Distinct。

中的数据来自多个重叠搜索,并且不是唯一的。

现有中有大约数百万行,中有数十万行。

数据全天24小时写入,每天新增约100万行。

中<〜> 95%的行已经存在于现有中,因此是不需要的重复项。但是,中的数据包含许多差距,现有中有许多最近的行,中不存在。

想要在Powershell中使用 Invoke-SqlCmd 现有中选择中的所有行。

然后想要从中删除所有已处理的行,这样它就不会无法控制地增长。

到目前为止我的方法是:

[已处理] 列添加到

为所有现有数据将 [已处理] 设置为0以供选择。继续添加的新行将具有 [Processed] = NULL ,并且将保持不变。

选择DISTINCT 来自 [已处理] = 0 的所有数据,并复制到名为暂存的表临时表。在此数据中查找最早的时间戳( [LastAccessed] )。然后使用 [已处理] = 0 新建中删除所有行。

现有的所有数据与 [LastAccessed] 复制等于或稍后的时间戳到 STAGING ,添加列 [已处理] = 1

现在我希望暂存中的所有数据 [已处理] = 0 ,并且没有重复。

我能想出的最近概念是:

SELECT MailboxOwnerUPN
      ,MailboxResolvedOwnerName
      ,LastAccessed
      ,ClientIPAddress
      ,ClientInfoString
      ,MailboxGuid
      ,Operation
      ,OperationResult
      ,LogonType
      ,ExternalAccess
      ,InternalLogonType
      ,LogonUserDisplayName
      ,OriginatingServer
FROM dbo.Office365Staging
GROUP BY MailboxOwnerUPN
        ,MailboxResolvedOwnerName
        ,LastAccessed
        ,ClientIPAddress
        ,ClientInfoString
        ,MailboxGuid
        ,Operation
        ,OperationResult
        ,LogonType
        ,ExternalAccess
        ,InternalLogonType
        ,LogonUserDisplayName
        ,OriginatingServer
HAVING Count(1) = 1  and Processed = 0;

我当然不能这样做,因为 [已处理] 不是Select或Group的一部分。如果我添加列 [已处理] ,则所有行都是唯一的,并且没有重复项。尝试了各种连接和其他技术,迄今为止没有成功。

最初没有 [已处理] = 0 ,查询有效,但从现有返回了不需要的唯一行。我只想要中的唯一行。

显然,由于这些结构的大小,效率是一个考虑因素。这个过程将定期进行,每15分钟一次。

识别这些新行然后在PowerShell中开始另一个Geo-IP,声誉,警报等过程....

1 个答案:

答案 0 :(得分:0)

以为下面的表现会很可怕,但在~27秒就可以了......

\n