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

GROUPBYは重複を削除しません

    GROUPBYは「重複を削除」しません。 GROUPBYでは集計が可能です。重複した行を結合するだけの場合は、SELECTDISTINCTを使用します。

    一部の列で重複している行を組み合わせる必要がある場合は、GROUP BYを使用しますが、他の列をどうするかを指定する必要があります。それらを省略したり(SELECT句にリストしないことにより)、またはそれらを集約したり(SUM、MIN、AVGなどの関数を使用)することができます。例:

    SELECT watch.watch_id, COUNT(rec.street_number), MAX(watch.watch_date)
    ... GROUP by watch.watch_id
    

    編集

    OPはいくつかの説明を求めました。

    「ビュー」(FROMとJOINおよびWHEREによってまとめられたすべてのデータ)をVと呼びます。実行したいことが2つあります。

    まず、完全に重複した行がある可能性があります 組み合わせたいもの:

    a b c
    - - -
    1 2 3
    1 2 3
    3 4 5
    

    次に、DISTINCTを使用します

    SELECT DISTINCT * FROM V;
    
    a b c
    - - -
    1 2 3
    3 4 5
    

    または、部分的に重複する行がある可能性があります 組み合わせたいもの:

    a b c
    - - -
    1 2 3
    1 2 6
    3 4 5
    

    これらの最初の2行は、ある意味では「同じ」ですが、別の意味では明らかに異なります(特に、 SELECT DISTINCTによって結合されます)。それらを組み合わせる方法を決定する必要があります。列cを重要でないものとして破棄できます:

    SELECT DISTINCT a,b FROM V;
    
    a b
    - -
    1 2
    3 4
    

    または、それらに対して何らかの集計を実行することもできます。それらを合計することができます:

    SELECT a,b, SUM(c) "tot" FROM V GROUP BY a,b;
    
    a b tot
    - - ---
    1 2 9
    3 4 5
    

    最小値を選択して追加できます:

    SELECT a,b, MIN(c) "first" FROM V GROUP BY a,b;
    
    a b first
    - - -----
    1 2 3
    3 4 5
    

    または、平均(AVG)、標準偏差(STD)、およびcの値の束を取り、それらを1つに結合する他の関数の束を取得することもできます。

    実際にはオプションではないのは、何もしないことです。グループ化されていない列をリストするだけの場合、DBMSはエラーをスローするか(Oracleはそれを実行します-正しい選択、imo)、または1つの値を多かれ少なかれランダムに選択します(MySQL)。しかし、Peart博士が言ったように、「あなたが決定しないことを選択したとき、あなたはまだ選択をしました。」



    1. 数列から不変の値の間隔を取得します

    2. MYSQLクエリ-現在のユーザーの投稿とフォローしているユーザーの投稿を取得します

    3. MySQLデータベースから何かをエコーし​​ます

    4. LIMIT使用時にSQLコマンドが正しく終了しない