sql >> データベース >  >> NoSQL >> MongoDB

SQLで最大値を持つ行を選択する3つの方法

    SQLを使用して、特定の列で最大値を持つ行を検索して選択する3つの例を次に示します。

    これらの例は、MySQL、MariaDB、PostgreSQL、SQLite、Oracle、SQLServerなどのほとんどの主要なRDBMSで機能します。

    サンプルデータ

    次のデータから始めます:

    SELECT * FROM PetShow;

    結果:

    +---------+-----------+---------+
    | PetId   | PetName   | Score   |
    |---------+-----------+---------|
    | 1       | Wag       | 85      |
    | 2       | Scratch   | 3       |
    | 3       | Tweet     | 65      |
    | 4       | Bark      | 8       |
    | 5       | Ruff      | 15      |
    | 6       | Woof      | 20      |
    | 7       | Punch     | 3       |
    +---------+-----------+---------+
    オプション1

    Scoreから最大値の行を選択する例を次に示します。 上記の表の列:

    SELECT 
        PetId,
        PetName,
        Score
    FROM PetShow 
    WHERE Score = ( SELECT MAX(Score) FROM PetShow );

    結果:

    +---------+-----------+---------+
    | PetId   | PetName   | Score   |
    |---------+-----------+---------|
    | 1       | Wag       | 85      |
    +---------+-----------+---------+

    MAX()を使用しました サブクエリ内で関数を使用して最大値を検索し、外部クエリで行全体を返しました。

    最大値の行が複数ある場合

    このメソッドを使用すると、最大値を持つ行が複数ある場合、それらすべてが返されます。

    既存の最大スコアと同じスコアを持つ別の行をテーブルに挿入するとします。

    INSERT INTO PetShow VALUES (8, 'Purr', 85);
    SELECT * FROM PetShow;

    テーブルは次のようになります:

    +---------+-----------+---------+
    | PetId   | PetName   | Score   |
    |---------+-----------+---------|
    | 1       | Wag       | 85      |
    | 2       | Scratch   | 3       |
    | 3       | Tweet     | 65      |
    | 4       | Bark      | 8       |
    | 5       | Ruff      | 15      |
    | 6       | Woof      | 20      |
    | 7       | Punch     | 3       |
    | 8       | Purr      | 85      |
    +---------+-----------+---------+

    WagとPurrの​​両方が85の最高スコアを獲得していることがわかります。

    前のクエリをもう一度実行して、その列から最大値を返しましょう:

    SELECT 
        PetId,
        PetName,
        Score
    FROM PetShow 
    WHERE Score = ( SELECT MAX(Score) FROM PetShow );

    結果:

    +---------+-----------+---------+
    | PetId   | PetName   | Score   |
    |---------+-----------+---------|
    | 1       | Wag       | 85      |
    | 8       | Purr      | 85      |
    +---------+-----------+---------+

    最大値の両方の行が期待どおりに返されます。

    必要に応じて、結果セットを1行に制限できます。正確なコードは、使用されているRDBMSによって異なります。

    LIMIT 句は、PostgreSQL、MariaDB、MySQL、SQLiteなどのRDBSで使用できます:

    SELECT 
        PetId,
        PetName,
        Score
    FROM PetShow 
    WHERE Score = ( SELECT MAX(Score) FROM PetShow )
    ORDER BY PetId ASC
    LIMIT 1;

    結果:

    +-------+---------+-------+
    | PetId | PetName | Score |
    +-------+---------+-------+
    |     1 | Wag     |    85 |
    +-------+---------+-------+

    SQL Serverでは、TOPを使用できます 条項:

    SELECT TOP 1
        PetId,
        PetName,
        Score
    FROM PetShow 
    WHERE Score = ( SELECT MAX(Score) FROM PetShow )
    ORDER BY PetId ASC;

    結果:

    +-------+---------+-------+
    | PetId | PetName | Score |
    +-------+---------+-------+
    |     1 | Wag     |    85 |
    +-------+---------+-------+

    そしてOracleデータベースの場合:

    SELECT
        PetId,
        PetName,
        Score
    FROM PetShow 
    WHERE Score = ( SELECT MAX(Score) FROM PetShow )
    ORDER BY PetId ASC
    FETCH FIRST 1 ROW ONLY;

    結果:

    +-------+---------+-------+
    | PetId | PetName | Score |
    +-------+---------+-------+
    |     1 | Wag     |    85 |
    +-------+---------+-------+
    オプション2

    1行だけを返したい場合は、実際には他のほとんどのコードを削除して、順序付けられた結果から最初の行を取得することができます。

    SELECT 
        PetId,
        PetName,
        Score
    FROM PetShow 
    ORDER BY Score DESC
    LIMIT 1;

    結果:

    +---------+-----------+---------+
    | PetId   | PetName   | Score   |
    |---------+-----------+---------|
    | 1       | Wag       | 85      |
    +---------+-----------+---------+

    SQL Serverの場合:

    SELECT TOP 1
        PetId,
        PetName,
        Score
    FROM PetShow 
    ORDER BY Score DESC;

    結果:

    +---------+-----------+---------+
    | PetId   | PetName   | Score   |
    |---------+-----------+---------|
    | 1       | Wag       | 85      |
    +---------+-----------+---------+

    そしてOracleデータベースの場合:

    SELECT
        PetId,
        PetName,
        Score
    FROM PetShow 
    ORDER BY Score DESC
    FETCH FIRST 1 ROW ONLY;

    結果:

    +---------+-----------+---------+
    | PetId   | PetName   | Score   |
    |---------+-----------+---------|
    | 1       | Wag       | 85      |
    +---------+-----------+---------+
    オプション3

    最大値の行を選択する別の方法は、次のようにテーブル自体を結合することです。

    SELECT 
        p1.PetId, 
        p1.PetName, 
        p1.Score
    FROM PetShow p1
    LEFT JOIN PetShow p2 ON p1.Score < p2.Score
    WHERE p2.PetId IS NULL;

    結果:

    +---------+-----------+---------+
    | PetId   | PetName   | Score   |
    |---------+-----------+---------|
    | 1       | Wag       | 85      |
    | 8       | Purr      | 85      |
    +---------+-----------+---------+

    前の例と同様に、必要に応じて結果を1行(または他の数)に制限できます。


    1. Structuremapを使用してServiceStackWebアプリケーションでキャッシュおよびMQとしてカスタム名前空間にRedisを設定する方法

    2. 集計の並べ替えaddToSet結果

    3. CDPの運用データベース

    4. Robo3TGUIを使用してMongoDBデプロイメントに接続する方法