7

重複する行がいくつかあるテーブルがあります。重複する行を1つだけ削除したい。

たとえば、9つの重複行があるため、1つの行のみを削除し、残りの8つの行を表示する必要があります。

期間timestampと呼ばれる日付呼び出し

2012-06-19 10:22:45.000 165 218 155 1.9 121
2012-06-19 10:22:45.000 165 218 155 1.9 121
2012-06-19 10:22:45.000 165 218 155 1.9 121
2012-06-19 10:22:45.000 165 218 155 1.9 121

上記の日付から1行のみを削除し、3行を表示する必要があります

2012-06-19 10:22:45.000 165 218 155 1.9 100
2012-06-19 10:22:45.000 165 218 155 1.9 100
2012-06-19 10:22:45.000 165 218 155 1.9 100

上記の日付から1行のみを削除し、2行を表示する必要があります

これどうやってするの?

4

6 に答える 6

9

このソリューションでは、(一度に 1 つの重複ブロックを処理するのではなく) 重複の各セットから 1 行を削除できます。

;WITH x AS 
(
  SELECT [date], rn = ROW_NUMBER() OVER (PARTITION BY 
    [date], calling, called, duration, [timestamp]
    ORDER BY [date])
  FROM dbo.UnspecifiedTableName
)
DELETE x WHERE rn = 2;

余談ですが、両方とも[date][timestamp]名のひどい選択です...

于 2012-06-20T15:46:28.970 に答える
2

SQL Server 2005+ の場合、次の操作を実行できます。

;WITH CTE AS
(
    SELECT  *, 
            ROW_NUMBER() OVER(PARTITION BY [date], calling, called, duration, [timestamp] ORDER BY 1) RN
    FROM YourTable
)
DELETE FROM CTE
WHERE RN = 2
于 2012-06-20T15:46:02.113 に答える
1

これらの行の順序を気にしない場合は、MySQLに次のコマンドがあります。

DELETE TOP (numberOfRowsToDelete) FROM db.tablename WHERE {condition for ex id = 5};
于 2012-06-20T15:25:09.887 に答える
1

テーブルに主キーはありますか?

行が重複する理由は何ですか? 同時?同じ日付?すべての列が同じですか?

主キーがある場合は、TOP 関数を使用して 1 つのレコードのみを選択し、その 1 つの行を削除できます。

Delete from [tablename] where id in (select top 1 id from [tablename] where [clause])
于 2012-06-20T15:24:02.770 に答える
-1

私はスキーマを持っていないので、可能な解決策を段階的に示します:

  1. すべての列の選択に行番号を適用する
  2. これらの列でグループを作成し、各グループの min(rownumber) を削除します

編集:

行番号は内部クエリにあり、行番号はすべての行で増加します。外側のクエリでは、内側のクエリのグループを作成し、各グループの min(rownumber) を選択します。各グループは重複した行で構成されているため、各グループの min(rownumber) を削除します。

于 2012-06-20T15:47:13.070 に答える