2

次の表には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.
4

1 に答える 1

0

ここで実際にいくつかの異なる質問をしましたが、クエリのロジックに完全に従っているかどうかはわかりませんが、クエリの作成はそれほど難しくありません。

まずdsm_hardware_basic、コピーではなく直接作業できます。

SELECT 
    * 
FROM dsm_hardware_basic

今その部分

最も古い [LastAgentExecution] 時刻を持つ重複した [HostUUID] を削除します

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

私たちが行ったことはHostUUID、最新のものでソートしてテーブルを分割LastAgentExecutionし、JOIN.

同じロジックを に適用できるようになりました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

最後の部分は練習問題として残しておきます。最後に、デバッグが完了したら、CREATE VIEWこれに追加するだけです。

于 2012-11-26T04:09:50.893 に答える