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

MySQLGROUPBYに相当するPostgreSQL

    バックティックは非標準のMySQLのものです。正規の二重引用符を使用して識別子を引用します(MySQLでも可能です)。つまり、テーブルの名前が実際に"MY_TABLE"である場合 (すべて大文字)。 (より賢明に)my_tableという名前を付けた場合 (すべて小文字)場合は、二重引用符を削除するか、小文字を使用できます。

    また、私はctを使用します countの代わりに 関数名を識別子として使用するのは悪い習慣なので、エイリアスとして。

    シンプルなケース

    これはPostgreSQL9.1で機能します :

    SELECT *, count(id) ct
    FROM   my_table
    GROUP  BY primary_key_column(s)
    ORDER  BY ct DESC;
    

    GROUP BYに主キー列が必要です 句。結果は同一です MySQLクエリに変換しますが、ct 常に1(またはid IS NULLの場合は0)になります )-重複を見つけるのに役に立たない。

    主キー列以外でグループ化

    他の列でグループ化したい場合は、事態はさらに複雑になります。このクエリはMySQLクエリの動作を模倣しており、できます *を使用する 。

    SELECT DISTINCT ON (1, some_column)
           count(*) OVER (PARTITION BY some_column) AS ct
          ,*
    FROM   my_table
    ORDER  BY 1 DESC, some_column, id, col1;
    

    これは、DISTINCT ONが機能するために機能します (PostgreSQL固有)DISTINCTなど (SQL標準)、に適用されます ウィンドウ関数count(*) OVER (...)ウィンドウ関数OVERを使用 条項)PostgreSQL 8.4が必要 以降、MySQLでは使用できません。

    主要な制約や一意の制約に関係なく、任意のテーブルで機能します。

    1 DISTINCT ON およびORDER BY SELECT内のアイテムの序数を参照するための省略形です。 リスト。

    SQLフィドル 両方を並べてデモンストレーションします。

    この密接に関連する回答の詳細:

    count(*) vs. count(id)

    重複を探している場合は、count(*)を使用することをお勧めします count(id)よりも 。 idの場合、微妙な違いがあります NULLにすることができます 、NULL 値はカウントされません-count(*) すべての行をカウントします。 idの場合 定義されているNOT NULL 、結果は同じですが、count(*) 一般的にはより適切です(そして少し速くなります)。



    1. SSRSで内部パラメータを使用するためのルールは何ですか

    2. Hibernate:インデックスを作成する

    3. 複数のテーブルのdrupalsql条件節?

    4. 作成済みのデータベースをアセットからコピーできません