web-dev-qa-db-ja.com

PostgreSQLウィンドウ関数:row_number()over(col2によるパーティションcol順序)

次の結果セットは、いくつかの結合と結合を持つSQLクエリから派生しています。 SQLクエリは、すでに日付とゲームの行をグループ化します。日付列で区切られたゲームの試行回数を説明する列が必要です。

Username   Game     ID   Date

johndoe1   Game_1   100  7/22/14 1:52 AM
johndoe1   Game_1   100  7/22/14 1:52 AM
johndoe1   Game_1   100  7/22/14 1:52 AM
johndoe1   Game_1   100  7/22/14 1:52 AM
johndoe1   Game_1   121  7/22/14 1:56 AM
johndoe1   Game_1   121  7/22/14 1:56 AM
johndoe1   Game_1   121  7/22/14 1:56 AM
johndoe1   Game_1   121  7/22/14 1:56 AM
johndoe1   Game_1   121  7/22/14 1:56 AM
johndoe1   Game_1   130  7/22/14 1:59 AM
johndoe1   Game_1   130  7/22/14 1:59 AM
johndoe1   Game_1   130  7/22/14 1:59 AM
johndoe1   Game_1   130  7/22/14 1:59 AM
johndoe1   Game_1   130  7/22/14 1:59 AM
johndoe1   Game_1   200  7/22/14 2:54 AM
johndoe1   Game_1   200  7/22/14 2:54 AM
johndoe1   Game_1   200  7/22/14 2:54 AM
johndoe1   Game_1   200  7/22/14 2:54 AM
johndoe1   Game_1   210  7/22/14 3:54 AM
johndoe1   Game_1   210  7/22/14 3:54 AM
johndoe1   Game_1   210  7/22/14 3:54 AM
johndoe1   Game_1   210  7/22/14 3:54 AM

パーティション内の行を列挙する次のSQLクエリがありますが、日付とゲームに基づいてそのゲームのインスタンスのカウントが必要なので、完全に正しいわけではありません。この場合、johndoe1はGame_1でタイムスタンプで5回パーティション分割しようとしました。

このクエリは、以下の結果セットを返します

select *
, row_number() over (partition by ct."date" order by ct."date") as "Attempts"
from csv_temp as ct

Username   Game     ID   Date             Attempts  (Desired Attempts col.)

johndoe1   Game_1   100  7/22/14 1:52 AM  1          1
johndoe1   Game_1   100  7/22/14 1:52 AM  2          1
johndoe1   Game_1   100  7/22/14 1:52 AM  3          1
johndoe1   Game_1   100  7/22/14 1:52 AM  4          1
johndoe1   Game_1   121  7/22/14 1:56 AM  1          2
johndoe1   Game_1   121  7/22/14 1:56 AM  2          2
johndoe1   Game_1   121  7/22/14 1:56 AM  3          2
johndoe1   Game_1   121  7/22/14 1:56 AM  4          2
johndoe1   Game_1   121  7/22/14 1:56 AM  5          2
johndoe1   Game_1   130  7/22/14 1:59 AM  1          3   
johndoe1   Game_1   130  7/22/14 1:59 AM  2          3
johndoe1   Game_1   130  7/22/14 1:59 AM  3          3
johndoe1   Game_1   130  7/22/14 1:59 AM  4          3
johndoe1   Game_1   130  7/22/14 1:59 AM  5          3
johndoe1   Game_1   200  7/22/14 2:54 AM  1          4
johndoe1   Game_1   200  7/22/14 2:54 AM  2          4
johndoe1   Game_1   200  7/22/14 2:54 AM  3          4
johndoe1   Game_1   200  7/22/14 2:54 AM  4          4
johndoe1   Game_1   210  7/22/14 3:54 AM  1          5
johndoe1   Game_1   210  7/22/14 3:54 AM  2          5
johndoe1   Game_1   210  7/22/14 3:54 AM  3          5
johndoe1   Game_1   210  7/22/14 3:54 AM  4          5

どんなポインタも大きな助けになるでしょう。

9
user1951677

_partition by_を_group by_のフィールドに似ていると考えてください。パーティション値が変更されると、ウィンドウ関数は1から再開します

A_horse_with_no_nameで示されているように、この必要性のために、dense_rank()row_number()rank()とは異なり、dense_rank()が必要です。 row_number()は、パーティション内の行ごとに異なる値でなければなりません。 rank()dense_rank()の違いは、後者が数値を「スキップ」しないことです。

クエリを試してください:

_dense_rank() over (partition by Username, Game order by ct."date") as "Attempts"
_

ちなみに、同じフィールドでパーティション分割したり、並べ替えたりすることはありません。必要な場合は、注文するだけで十分です。ここではありません。

24
Used_By_Already