Sql 与特定条件匹配的唯一行

Sql 与特定条件匹配的唯一行,sql,sql-server,powershell,tsql,Sql,Sql Server,Powershell,Tsql,我的数据是Microsoft Office 365邮箱审核日志 我正在使用14列,包括名称、时间戳、IP地址等 我有两个表,让我们称它们为现有的和新的。两个表中的列定义、顺序和计数相同 现有中的数据(非常接近!)不同 New中的数据是从多个重叠的搜索中提取的,不明显 现有的中大约有数百万行,新的中有几十万行 数据一直在全天候写入新的中,每天添加约100万行 New中约95%的行已存在于现有的中,因此是不需要的重复项。然而,New中包含的数据有许多空白,现有的中有许多最近的行在New中不存在 要使

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

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

我有两个表,让我们称它们为现有的新的。两个表中的列定义、顺序和计数相同

现有
中的数据(非常接近!)不同

New中的数据是从多个重叠的搜索中提取的,不明显

现有的
中大约有数百万行,新的
中有几十万行

数据一直在全天候写入新的中,每天添加约100万行

New中约95%的行已存在于现有的中,因此是不需要的重复项。然而,New中包含的数据有许多空白,现有的中有许多最近的行在New中不存在

要使用Powershell中的调用SqlCmd新建中选择现有中不存在的所有行

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

到目前为止,我的做法是:

[处理过的]列添加到新建

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

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

[LastAccess]等于或高于上述时间戳的现有中的所有数据复制到暂存,添加列[Processed]=1

现在我希望所有数据都在暂存中,其中[Processed]=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;
当然我不能这样做,因为[Processed]不是Select或Group的一部分。如果我添加列[Processed],则所有行都是唯一的,没有重复项。已经尝试了各种连接和其他技术,但迄今为止没有成功

最初没有[Processed]=0,查询工作,但从现有的返回不需要的唯一行。我只想要新的中唯一的行

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


识别这些新线路,然后在PowerShell中启动另一个地理IP、声誉、警报等过程。

认为以下性能会很糟糕,但在约27秒时就可以了

SELECT [MailboxOwnerUPN]
      ,[MailboxResolvedOwnerName]
      ,[LastAccessed]
      ,[ClientIPAddress]
      ,[ClientInfoString]
      ,[MailboxGuid]
      ,[Operation]
      ,[OperationResult]
      ,[LogonType]
      ,[ExternalAccess]
      ,[InternalLogonType]
      ,[LogonUserDisplayName]
      ,[OriginatingServer]
  FROM dbo.New
  WHERE [Processed] = 1 and
        NOT EXISTS (Select * From dbo.Existing
                          Where New.LastAccessed = Existing.LastAccessed and 
                                New.ClientIPAddress = Existing.ClientIPAddress and
                                New.ClientInfoString = Existing.ClientInfoString and
                                New.MailboxGuid = Existing.MailboxGuid)
GO

您是否能够显示一些示例数据?我认为CTE是解决这类问题的最佳方法。