simlpeSERIAL
列をテーブルに追加して(順序を指定します)、次のように使用できます。
SELECT *, row_number() OVER (PARTITION BY month ORDER BY serial_column)
FROM table
これにより、希望する結果が得られます。
行を並べ替える必要がない場合は、次のことを試すことができます。
SELECT *, row_number() OVER (PARTITION BY month)
FROM table
詳細はこちら:row_number() OVER(...)
UPD仕組み:
タイプの列SERIAL
は、基本的に「自動増分」フィールドです。シーケンスから自動的に値を取得します。テーブルに行を挿入すると、次のようになります。
| MONTH | SERIAL_COLUMN | DESCRIPTION |
-----------------------------------------------------------
| 1 | 1 | One thing |
| 1 | 2 | Another thing |
| 1 | 3 | Last task of the month |
| 2 | 4 | First of second month |
| 2 | 5 | Second and last of second month |
| 3 | 6 | First of third month |
重要なこと-次に追加されるすべての行の値は、前のすべての行よりもSERIAL_COLUMN
大きくなります。
次。しますrow_number() OVER (PARTITION BY month ORDER BY serial_column)
:
month
1)すべての行を等しい(PARTITION BY month
)でグループに分割します
serial_column
2) (ORDER BY serial_column
)の値で並べ替えます
`row_number() OVER
3)すべてのグループで、手順2( )の順序を使用して行番号を割り当てます。
出力は次のとおりです。
| MONTH | SERIAL_COLUMN | DESCRIPTION | ROW_NUMBER |
------------------------------------------------------------------------
| 1 | 1 | One thing | 1 |
| 1 | 2 | Another thing | 2 |
| 1 | 3 | Last task of the month | 3 |
| 2 | 4 | First of second month | 1 |
| 2 | 5 | Second and last of second month | 2 |
| 3 | 6 | First of third month | 1 |
の出力を変更するにはrow_number()
、の値を変更する必要がありますSERIAL_COLUMN
。たとえば、 aのSecond and last of second month
前に配置すると、次のようFirst of second month
に値が変更されます。SERIAL_COLUMN
UPDATE Table1
SET serial_column = 5
WHERE description = 'First of second month';
UPDATE Table1
SET serial_column = 4
WHERE description = 'Second and last of second month';
クエリの出力が変更されます。
| MONTH | SERIAL_COLUMN | DESCRIPTION | ROW_NUMBER |
------------------------------------------------------------------------
| 1 | 1 | One thing | 1 |
| 1 | 2 | Another thing | 2 |
| 1 | 3 | Last task of the month | 3 |
| 2 | 4 | Second and last of second month | 1 |
| 2 | 5 | First of second month | 2 |
| 3 | 6 | First of third month | 1 |
の正確な値は重要でSERIAL_COLUMN
はありません。彼らは1か月のタスクの順序を設定するだけです。
私のSQLFiddleの例はここにあります。