* ウィンドウ関数 [#qe0b1929]
** 前提 [#b36fabab]
# SELECT * FROM t1;
id | num | grp
----+-----+-----
1 | 100 | 1
2 | 200 | 1
3 | 500 | 1
4 | 300 | 2
5 | 200 | 2
7 | 300 | 2
6 | 400 | 2
** row_number() [#ac975e3b]
row_number() OVER() で行番号を付与する。
# SELECT row_number() OVER(), id, num FROM t1;
row_number | id | num
------------+----+-----
1 | 1 | 100
2 | 2 | 200
3 | 3 | 500
4 | 4 | 300
5 | 5 | 200
6 | 7 | 300
7 | 6 | 400
row_number() OVER(ORDER BY id DESC) でIDを降順にソートして行番号を付与する。
# SELECT row_number() OVER(ORDER BY id DESC), id, num FROM t1;
row_number | id | num
------------+----+-----
1 | 7 | 300
2 | 6 | 400
3 | 5 | 200
4 | 4 | 300
5 | 3 | 500
6 | 2 | 200
7 | 1 | 100
** rank() [#n642682f]
rank() OVER(ORDER BY num DESC) でNUMを降順にソートして順位を付与する。
# SELECT rank() OVER(ORDER BY num DESC), id, num FROM t1;
rank | id | num
------+----+-----
1 | 3 | 500
2 | 6 | 400
3 | 4 | 300
3 | 7 | 300
5 | 5 | 200
5 | 2 | 200
7 | 1 | 100
rank() OVER(PARTITION BY grp ORDER BY num DESC) でグループ=2に絞ってNUMを降順にソートして順位を付与する。
# SELECT rank() OVER(PARTITION BY grp ORDER BY num DESC), id, grp, num FROM t1 WHERE grp = 2;
rank | id | grp | num
------+----+-----+-----
1 | 6 | 2 | 400
2 | 4 | 2 | 300
2 | 7 | 2 | 300
4 | 5 | 2 | 200
** 参考 [#v361ddad]
- http://www.postgresql.jp/document/current/html/tutorial-window.html