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

crosstab()クエリの結果に対するフィルタリングの予期しない影響

    extra1, extra2, ... 「追加の列」です クロス集計用語で。
    tablefuncモジュールのマニュアル ルールの説明:

    そしてさらに下へ:

    私は重要な部分を大胆に強調しています。

    row_nameでのみ並べ替えます :

    ORDER  BY row_name ASC
    

    次のようにフィルタリングする最初の例では重要ではありません:

    WHERE ... t.extra1 = 'val1'  -- single quotes by me
    

    すべての入力行にはextra1 = 'val1'があります とりあえず。ただし、次のようにフィルタリングする2番目の例では重要です。

    WHERE ... t.extra1 IN('val1', ...) --> More values
    

    現在、上記の最初の太字の要件は、追加の列extra1で違反しています。 。最初の入力クエリの並べ替え順序は非決定論的ですが、「extra」列の結果の値はextra1 任意に選択されます。 extra1のより多くの可能な値 、行が少なくなると「val1」になります。これが観察されたものです。

    あなたはまだそれを機能させることができます:extra1 = 'val1'を報告する すべてのrow_nameに対して それらの少なくとも1つがある場合は、ORDER BYを変更します 宛先:

    ORDER  BY row_name, (extra1 <> 'val1')
    

    'val1'を上にソートします。そのbooleanの説明 式(詳細へのリンク付き):

    他の「余分な」列は、並べ替え順序が決定論的ではない場合でも、任意に選択されます。

    クロス集計の基本:




    1. 致命的なエラーmysql.h:コンパイル中にそのようなファイルまたはディレクトリはありません

    2. MySQL UPDATEクエリ中に2つの文字列を連結するにはどうすればよいですか?

    3. binログディレクトリを変更してみてください:mysql-bin.indexが見つかりません(Errcode:13)

    4. Pythonを使用したMySQLへの接続