Yanor.net/
Wiki
Blog
GitHub
Sandbox
開始行:
* PARTITION BYの複数の対象列を同等に評価してRANKを取る [#...
** 前提と目的 [#g4893cf7]
CREATE TABLE t1 ( id int, score int, grp1 text, grp2 tex...
INSERT INTO t1 VALUES (1, 250, 'A', 'B'), (2, 200, 'B', ...
sql=> SELECT * FROM t1;
id | score | grp1 | grp2
----+-------+------+------
1 | 250 | A | B
2 | 200 | B | C
3 | 300 | B | A
4 | 150 | D | B
5 | 400 | C | A
- grp1、grp2を合わせて、A、B、C、Dのグループがあるが、そ...
- すなわち、Aグループの1位はid:5の400、Bグループの1位はid...
** PARTITION BYに対象列を並べて指定して集計する [#r0b5f6fc]
sql=> SELECT id, grp1, grp2, score, RANK() OVER (PARTITI...
id | grp1 | grp2 | score | rank
----+------+------+-------+------
1 | A | B | 250 | 1
3 | B | A | 300 | 1
2 | B | C | 200 | 1
5 | C | A | 400 | 1
4 | D | B | 150 | 1
- '''PARTITION BY''' に '''grp1, grp2''' を指定すると、順...
** それぞれの対象列を取るインラインテーブルを作り、それを...
sql=> WITH t2 AS ( SELECT id, score, grp1 AS grp FROM t1...
SELECT id, grp, score, RANK() OVER (PARTITION BY grp ORD...
id | grp | score | rank
----+-----+-------+------
5 | A | 400 | 1
3 | A | 300 | 2
1 | A | 250 | 3
3 | B | 300 | 1
1 | B | 250 | 2
2 | B | 200 | 3
4 | B | 150 | 4
5 | C | 400 | 1
2 | C | 200 | 2
4 | D | 150 | 1
- したがって、grp1を取るインラインテーブルとgrp2を取るイ...
- その後、'''PARTITION BY grp''' する
- すると、順位が取れる
終了行:
* PARTITION BYの複数の対象列を同等に評価してRANKを取る [#...
** 前提と目的 [#g4893cf7]
CREATE TABLE t1 ( id int, score int, grp1 text, grp2 tex...
INSERT INTO t1 VALUES (1, 250, 'A', 'B'), (2, 200, 'B', ...
sql=> SELECT * FROM t1;
id | score | grp1 | grp2
----+-------+------+------
1 | 250 | A | B
2 | 200 | B | C
3 | 300 | B | A
4 | 150 | D | B
5 | 400 | C | A
- grp1、grp2を合わせて、A、B、C、Dのグループがあるが、そ...
- すなわち、Aグループの1位はid:5の400、Bグループの1位はid...
** PARTITION BYに対象列を並べて指定して集計する [#r0b5f6fc]
sql=> SELECT id, grp1, grp2, score, RANK() OVER (PARTITI...
id | grp1 | grp2 | score | rank
----+------+------+-------+------
1 | A | B | 250 | 1
3 | B | A | 300 | 1
2 | B | C | 200 | 1
5 | C | A | 400 | 1
4 | D | B | 150 | 1
- '''PARTITION BY''' に '''grp1, grp2''' を指定すると、順...
** それぞれの対象列を取るインラインテーブルを作り、それを...
sql=> WITH t2 AS ( SELECT id, score, grp1 AS grp FROM t1...
SELECT id, grp, score, RANK() OVER (PARTITION BY grp ORD...
id | grp | score | rank
----+-----+-------+------
5 | A | 400 | 1
3 | A | 300 | 2
1 | A | 250 | 3
3 | B | 300 | 1
1 | B | 250 | 2
2 | B | 200 | 3
4 | B | 150 | 4
5 | C | 400 | 1
2 | C | 200 | 2
4 | D | 150 | 1
- したがって、grp1を取るインラインテーブルとgrp2を取るイ...
- その後、'''PARTITION BY grp''' する
- すると、順位が取れる
ページ名: