この記事を読むのに必要な時間は約 5 分です。
重複している行の特定と削除
特定
登録されているデータについて重複行が存在していると意図していない結果になって今う事があります。
対象データに重複データが存在していないか事前に確認する方法を見てみたいと思います。
サンプルデータの確認
サンプルデータは此方です。
前回の記事でサンプルデータを大量に登録していますので流用してみます。
このデータですね。
データとして面白そうな場所は kanji の列ですのでこの列に絞ってみたいと思います。
まずは表示するだけのSelect文です。
SELECT [kanji] FROM [test001].[dbo].[JIGYOSYO$]
ほい!
データが表示されました。
それではここから重複が存在しているかどうか確認してみたいと思います。
group by
重複の有無を確定して特定する方法は group by を使います。
group by は通常、グループ化で利用しますが、重複の特定でも使えます。
Select文は以下です。
SELECT count([kanji]),kanji FROM [test001].[dbo].[JIGYOSYO$] group by kanji
(株) NTTソルコ新百合ヶ丘センター
で、重複データが見つかりましたね。
ただ、大量のデータの中から特定するのは大変です。
そのため、以下のどちらかでデータを見やすくしたいと思います。
order by
単純に並び替えを行います。
sql文は以下の通りです。
SELECT count([kanji]),kanji FROM [test001].[dbo].[JIGYOSYO$] group by kanji order by count([kanji]) desc
単純に並び替えただけですね。
大量の重複データが存在している事が分かりました。
order by を使う場合、特定する目的よりも確認するという目的になると思います。
※単純に次の having区よりも簡単なため
having区
次はhaving区です。
having区を使うと、厳密に重複しているデータのみを抽出してくれます。
sql文はこのようになります。
SELECT count([kanji]),kanji FROM [test001].[dbo].[JIGYOSYO$] group by kanji having count([kanji])>1
この手法はデータの特性を理解している場合のみ利用可能です。
having区は group by でグループ化した結果に対して where区の様な条件指定ができます。
group by でグルーピングしたデータが2個以上であるデータは重複しているデータ
という、一見当たり前の事でもデータとして理解していなければこの方法にはたどりつけません。
削除
それでは実際に重複したデータをなくしてみたいと思います。
因みに方法自体は以下の記事と殆ど同じ内容です。
distinct を使う
重複したデータについて
重複している事実をなくしたいだけ
なら、実は物凄く簡単です。
sql文は以下となります。
SELECT distinct kanji FROM [test001].[dbo].[JIGYOSYO$]
通常の一覧を表示させるSQL文がと比較して distinct と一文字付け加えるだけです。
- SELECT distinct kanji FROM [test001].[dbo].[JIGYOSYO$]
- SELECT kanji FROM [test001].[dbo].[JIGYOSYO$]
これだけですね。
特定する方法を中心に考えると group by なり having なりといろいろ頭使いますが、重複を消すだけなら distinct の一文字を覚えておけば何とかなります!