Erstellen Sie eine view, die mehrere datasätze aus der Tabelle auf der Grundlage verschiedener Kriterien entfernt

Die untenstehende Tabelle hat PC-Asset-Informationen und ich muss Scheiben von data aus ihm auf der Grundlage von verschiedenen Kriterien zu entfernen.

Ich muss eine view in SQL server 2005 erstellen, die meine Ergebnisse zurückgibt.

Ich habe versucht, meine Ziele mit temporären Tischen zu erreichen, bis ich merkte, dass ich keine temporären Tabellen in einer view verwenden konnte.

Ich habe dann versucht, einen CTE zu benutzen, bis ich erkannte, dass das Löschen von data aus einem CTE auch data aus der eigentlichen Tabelle löschen würde.

Ich kann keine data aus der aktuellen Tabelle löschen. Ich kann auch keine andere Tabelle in der database erstellen.

Der Tisch hat 160.000 datasätze.

Der Tisch:

TABLE dsm_hardware_basic ( [UUID] binary(16) -- Randomly generated 16 digit key that is unique for each record, only column with no duplicate rows. [HostUUID] binary(16) -- Randomly generated 16 digit key, column has duplicate rows. [Name] nvarchar(255) -- Column that contains hostnames of computer assets. Example of record: PCASSET001. Column has duplicate rows. [LastAgentExecution] datetime -- The last time that the software agent that collects asset information ran on the PC. [HostName] nvarchar(255) -- The fully qualified domain name of the PC. Example of record: PCASSET001.companydomain.com. Column has duplicate rows. ) 

Ich werde erklären, was ich erreichen möchte:

1) Lesen Sie alle Informationen aus der Tabelle dbo.dsm_hardware_basic. Nennen wir das: dsm_hardware_basic_copy.

2) Abfrage dbo.dsm_hardware_basic und entfernen Sie data, die die folgenden Kriterien von dsm_hardware_basic_copy passt. Dies beseitigt grundsätzlich das Duplikat [HostUUID] mit der ältesting [LastAgentExecution] time:

  SELECT ,dsm_hardware_basic.[HostUUID] ,MIN(dsm_hardware_basic.[LastAgentExecution]) AS [LastAgentExecution] FROM dsm_hardware_basic WHERE dsm_hardware_basic.[HostUUID] <> '' GROUP BY dsm_hardware_basic.[HostUUID] HAVING COUNT(*) = 2 -- The tiny amount of rows where this count is >2 will be left alone. 

3) Zusätzliche Abfrage dbo.dsm_hardware_basic und entfernen Sie data, die die folgenden Kriterien von dsm_hardware_basic_copy passt: Das entfernt grundsätzlich das Duplikat [HostName] mit der ältesting [LastAgentExecution] time:

  SELECT ,dsm_hardware_basic.[HostName] ,MIN(dsm_hardware_basic.[LastAgentExecution]) AS [LastAgentExecution] FROM dsm_hardware_basic WHERE dsm_hardware_basic.[HostName] <> '' GROUP BY dsm_hardware_basic.[HostName] HAVING COUNT(*) > 1 

Ich war mir nicht sicher, wie dies in der obigen Auswahl zu tun, aber nicht nur sollte die COUNT von [HostName]> 1 sein, aber [Name] sollte alles in [HostName] vor der ersten Periode in [HostName] gleich sein. Beispiel [Name]: PCASSET001. Beispiel [HostName]: PCASSET001.companydomain.com. Ich weiß, das klingt seltsam in Anbetracht der Art von PC-data, die wir in diesen beiden Spalten sprechen, aber es ist etwas, was ich eigentlich mit zu kämpfen habe.

3) Zusätzlich abfragen dbo.dsm_hardware_basic und entfernen Sie data, die die folgenden Kriterien von dsm_hardware_basic_copy passt:

Dies beseitigt grundsätzlich das Duplikat [Name] mit der ältesting [LastAgentExecution] time:

  SELECT ,dsm_hardware_basic.[Name] ,MIN(dsm_hardware_basic.[LastAgentExecution]) AS [LastAgentExecution] FROM dsm_hardware_basic WHERE dsm_hardware_basic.[Name] <> '' GROUP BY dsm_hardware_basic.[Name] HAVING COUNT(*) = 2 -- The tiny amount of rows where this count is >2 will be left alone. 

Sie haben hier eigentlich einige verschiedene Fragen gestellt und ich bin mir nicht sicher, ob ich die Logik der Abfrage vollständig befolge, aber es sollte nicht zu schwierig sein.

Um zu beginnen, können Sie dsm_hardware_basic direkt anstatt eine Kopie arbeiten:

 SELECT * FROM dsm_hardware_basic 

Jetzt das Teil das

entfernt das Duplikat [HostUUID] mit der ältesting [LastAgentExecution] time

 SELECT dsm_hardware_basic.* FROM dsm_hardware_basic INNER JOIN ( SELECT [UUID], ROW_NUMBER() OVER (PARTITION BY [HostUUID] ORDER BY [LastAgentExecution] DESC) AS host_UUID_rank FROM dsm_hardware_basic WHERE [HostUUID] <> '' ) AS duplicate_host_UUID_filtered ON dsm_hardware_basic.UUID = duplicate_host_UUID_filtered.UUID AND duplicate_host_UUID_filtered.host_UUID_rank = 1 

Was wir getan haben, ist Ihre Tabelle von HostUUID nach der neuesten HostUUID sortiert ist, partitioniert und jede UUID aus der Abfrage entfernt, die mit einem JOIN übereinstimmt.

Wir können nun die gleiche Logik auf Ihren HostName :

 SELECT dsm_hardware_basic.* FROM dsm_hardware_basic INNER JOIN ( SELECT [UUID], ROW_NUMBER() OVER (PARTITION BY [HostUUID] ORDER BY [LastAgentExecution] DESC) AS host_UUID_rank FROM dsm_hardware_basic WHERE [HostUUID] <> '' ) AS duplicate_host_UUID_filtered ON dsm_hardware_basic.UUID = duplicate_host_UUID_filtered.UUID AND duplicate_host_UUID_filtered.host_UUID_rank = 1 INNER JOIN ( SELECT [UUID], ROW_NUMBER() OVER (PARTITION BY [HostName] ORDER BY [LastAgentExecution] DESC) AS host_UUID_rank FROM dsm_hardware_basic WHERE [HostName] <> '' ) AS duplicate_HostName_filtered ON dsm_hardware_basic.UUID = duplicate_HostName_filtered.UUID AND duplicate_HostName_filtered.host_UUID_rank = 1 

Ich gebe dir den letzten Teil als Übung. Schließlich, nachdem du Debugging gemacht hast, füge einfach CREATE VIEW .