sql >> データベース >  >> RDS >> MariaDB

MariaDBで重複する行を選択する4つの方法

    MariaDBデータベースに重複する行があると思われるテーブルがある場合は、次のクエリのいずれかを使用して、重複する行の数を把握できます。

    サンプルデータ

    次のデータを含むテーブルがあるとします。

    SELECT * FROM Pets;

    結果:

    +---------+-----------+-----------+
    | PetId   | PetName   | PetType   |
    |---------+-----------+-----------|
    | 1       | Wag       | Dog       |
    | 1       | Wag       | Dog       |
    | 2       | Scratch   | Cat       |
    | 3       | Tweet     | Bird      |
    | 4       | Bark      | Dog       |
    | 4       | Bark      | Dog       |
    | 4       | Bark      | Dog       |
    +---------+-----------+-----------+

    最初の2行は重複しており、最後の3行は重複しています。

    オプション1

    次のクエリを使用して、重複している行の数を確認できます。

    SELECT 
        DISTINCT PetId, 
        COUNT(*) AS "Count"
    FROM Pets
    GROUP BY PetId
    ORDER BY PetId;

    結果:

    +---------+---------+
    | PetId   | Count   |
    |---------+---------|
    | 1       | 2       |
    | 2       | 1       |
    | 3       | 1       |
    | 4       | 3       |
    +---------+---------+

    SELECTを展開できます 必要に応じて列を追加するリスト:

    SELECT 
        PetId,
        PetName,
        PetType,
        COUNT(*) AS "Count"
    FROM Pets
    GROUP BY 
        PetId,
        PetName,
        PetType
    ORDER BY PetId;

    結果:

    +---------+-----------+-----------+---------+
    | PetId   | PetName   | PetType   | Count   |
    |---------+-----------+-----------+---------|
    | 1       | Wag       | Dog       | 2       |
    | 2       | Scratch   | Cat       | 1       |
    | 3       | Tweet     | Bird      | 1       |
    | 4       | Bark      | Dog       | 3       |
    +---------+-----------+-----------+---------+
    >

    または、カウントの降順で並べ替えて、重複が最も多い行が最初に表示されるようにすることもできます。

    SELECT 
        PetId,
        PetName,
        PetType,
        COUNT(*) AS "Count"
    FROM Pets
    GROUP BY 
        PetId,
        PetName,
        PetType
    ORDER BY Count DESC;

    結果:

    +-------+---------+---------+-------+
    | PetId | PetName | PetType | Count |
    +-------+---------+---------+-------+
    |     4 | Bark    | Dog     |     3 |
    |     1 | Wag     | Dog     |     2 |
    |     3 | Tweet   | Bird    |     1 |
    |     2 | Scratch | Cat     |     1 |
    +-------+---------+---------+-------+

    オプション2

    重複する行のみをリストする場合は、 HAVINGを使用できます。 重複しない行を除外する句:

    SELECT 
        PetId,
        PetName,
        PetType,
        COUNT(*) AS "Count"
    FROM Pets
    GROUP BY 
        PetId,
        PetName,
        PetType
    HAVING COUNT(*) > 1
    ORDER BY PetId;

    結果:

    +-------+---------+---------+-------+
    | PetId | PetName | PetType | Count |
    +-------+---------+---------+-------+
    |     1 | Wag     | Dog     |     2 |
    |     4 | Bark    | Dog     |     3 |
    +-------+---------+---------+-------+

    オプション3

    これを行う別の方法は、ROW_NUMBER()を使用することです。 PARTITION BYで機能する 結果セットの出力に番号を付ける句。

    SELECT 
        *, 
        ROW_NUMBER() OVER ( 
            PARTITION BY PetId, PetName, PetType 
            ORDER BY PetId, PetName, PetType
            ) AS Row_Number
    FROM Pets;

    結果:

    +-------+---------+---------+------------+
    | PetId | PetName | PetType | Row_Number |
    +-------+---------+---------+------------+
    |     1 | Wag     | Dog     |          1 |
    |     1 | Wag     | Dog     |          2 |
    |     2 | Scratch | Cat     |          1 |
    |     3 | Tweet   | Bird    |          1 |
    |     4 | Bark    | Dog     |          1 |
    |     4 | Bark    | Dog     |          2 |
    |     4 | Bark    | Dog     |          3 |
    +-------+---------+---------+------------+

    PARTITION BY 句は、FROMによって生成された結果セットを分割します 関数が適用されるパーティションへの句。結果セットにパーティションを指定すると、各パーティションによって番号付けが最初からやり直されます(つまり、各パーティションの最初の行の番号付けは1から始まります)。

    オプション4

    一致する重複から余剰行だけを返すには、次のように、上記のクエリを一般的なテーブル式として使用できます。

    WITH cte AS 
        (
            SELECT 
                *, 
                ROW_NUMBER() OVER ( 
                    PARTITION BY PetId, PetName, PetType 
                    ORDER BY PetId, PetName, PetType
                    ) AS Row_Number
            FROM Pets
        )
    SELECT * FROM cte WHERE Row_Number <> 1;

    結果:

    +-------+---------+---------+------------+
    | PetId | PetName | PetType | Row_Number |
    +-------+---------+---------+------------+
    |     1 | Wag     | Dog     |          2 |
    |     4 | Bark    | Dog     |          2 |
    |     4 | Bark    | Dog     |          3 |
    +-------+---------+---------+------------+

    1. Oracleで大文字に変換する2つの方法

    2. T-SQL火曜日#106:INSTEADOFトリガー

    3. WiXで、Oracle ODP.Netのレジストリキー(値ではない)の存在をテストするにはどうすればよいですか。

    4. PostgreSQLでの日付の操作