1

row_number() を使用して、降順を作成し、位置 1 にいるかどうかを確認して、クエリの最後の行を決定しています。

row | value
----+-------
  3 | false
  2 | false
  1 | true

すべてのグループの最後の行を決定するために同じ手法を適用する方法を知っていますか?

期待される結果は次のようになります。

uid | row | value
----+-----+-------
  1 |   3 | false
  1 |   2 | false
  1 |   1 | true
  2 |   4 | false
  2 |   3 | false
  2 |   2 | false
  2 |   1 | true
  3 |   2 | false
  3 |   1 | true

または、PostgreSQL で最後の行を検出するより良い方法を知っていますか?

4

2 に答える 2

2

PARTITION BYあなたの一部として使用OVER()

select uid,something,
  ROW_NUMBER() OVER (PARTITION BY uid ORDER BY something desc) as row
from
  someTable

PARTITION BY使用しているウィンドウ関数( などROW_NUMBER())が、定義されている各パーティションで完全に個別に動作するようにします。したがってROW_NUMBER、 number を再起動MAXし、パーティション内の行の最大値を見つけます。

于 2013-07-25T14:14:24.197 に答える
1

サブクエリを追加せずに、グループごと (または全体)の最後の行を実際に決定するには、ウィンドウ関数を使用できますlead()。これは、昇順のそれほど重要でない場合にも機能します。

SELECT uid, something
      ,row_number() OVER w AS row
      ,lead (TRUE, 1, FALSE) OVER w AS value
FROM  tbl
WINDOW w AS (PARTITION BY uid ORDER BY something DESC) 

lead()グループ内に「次の」行が見つからない場合に、デフォルトを提供する 3 番目のパラメーターという、めったに使用されない機能があります。TRUEこのようにして、「次の」行を含む行の定数を返し、FALSEelse に置き換えることができます。

また、この節を使用してWINDOWいますが、これは単なる表記上の便宜であるため、ウィンドウ定義を 2 回綴る必要はありません。

于 2013-07-25T16:41:15.913 に答える