次の表にはPC資産情報があり、さまざまな基準に基づいてデータのスライスを削除する必要があります。
結果を返すビューをSQLServer2005で作成する必要があります。
ビューで一時テーブルを使用できないことに気付くまで、一時テーブルを使用して目標を達成しようとしました。
次に、CTEからデータを削除すると、実際のテーブルからもデータが削除されることに気付くまで、CTEを使用しようとしました。
実際のテーブルからデータを削除できません。データベースに別のテーブルを作成することもできません。
テーブルには160,000レコードがあります。
テーブル:
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.
)
私が達成したいことを説明します:
1)テーブルdbo.dsm_hardware_basicからすべての情報を読み込みます。これをdsm_hardware_basic_copyと呼びましょう。
2)dbo.dsm_hardware_basicを照会し、dsm_hardware_basic_copyから次の基準に一致するデータを削除します。これにより、基本的に、[LastAgentExecution]時刻が最も古い重複[HostUUID]が削除されます。
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)さらにdbo.dsm_hardware_basicにクエリを実行し、dsm_hardware_basic_copyから次の基準に一致するデータを削除します。これにより、基本的に、[LastAgentExecution]の時間が最も古い重複する[HostName]が削除されます。
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
上記の選択でこれを行う方法がわかりませんでしたが、[HostName]のCOUNTが> 1であるだけでなく、[Name]は[HostName]の最初のピリオドの前に[HostName]のすべてと等しくなければなりません。例[名前]:PCASSET001。例[ホスト名]:PCASSET001.companydomain.com。この2つのコラムで話しているPCデータの種類を考えると、これは奇妙に聞こえるかもしれませんが、実際に対処する必要があります。
3)さらに、dbo.dsm_hardware_basicにクエリを実行し、dsm_hardware_basic_copyから次の基準に一致するデータを削除します。
これにより、基本的に、[LastAgentExecution]の時間が最も古い重複する[Name]が削除されます。
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.