14

最初のFETCHの直後に結果セット内の行の総数が必要なカーソルのペアの場合(試行錯誤の後)、以下のクエリを思いつきました

SELECT
 col_a,
 col_b,
 col_c,
 COUNT(*) OVER( PARTITION BY 1 ) AS rows_in_result
FROM 
 myTable JOIN theirTable ON
 myTable.col_a = theirTable.col_z
GROUP BY
 col_a, col_b, col_c
ORDER BY 
 col_b

クエリの出力が X 行の場合、rows_in_result はこれを正確に反映します。

  • PARTITION BY 1 とはどういう意味ですか?
    • おそらくデータベースに、結果をそれぞれ1行ずつに分割するように指示していると思います
4

2 に答える 2

16

PARTITIONBYの珍しい使い方です。これは、すべてを同じパーティションに配置して、クエリが合計で123行を返す場合、各行のrows_in_resultの値が123になるようにします(エイリアスが示すように)。

したがって、これはより簡潔なものと同等です。

COUNT(*) OVER ()
于 2010-07-26T20:06:19.377 に答える
5

データベースは、OVER()句に制限を追加するのは非常に自由です。集計関数によっては、PARTITION BY [...]and/orが必須の句になる場合があります。構文の整合性のために使用される単なるダミー句である可能性があります。次の 2 つは通常同等です。ORDER BY [...]PARTITION BY 1

[aggregate function] OVER ()
[aggregate function] OVER (PARTITION BY 1)

ただし、Sybase SQL Anywhere とCUBRID1は、これを列インデックス参照であると解釈することに注意してください。これは、ORDER BY [...]句で可能なことと同様です。これは、クエリのプロジェクションに評価順序を課すため、少し意外に思えるかもしれません。あなたの場合、これは以下が同等であることを意味します

COUNT(*) OVER (PARTITION BY 1)
COUNT(*) OVER (PARTITION BY col_a)

他のデータベースの解釈からのこの奇妙な逸脱により、より複雑なグループ化式を参照できます。

于 2012-12-03T11:45:55.680 に答える