https://www.youtube.com/watch?v=qdqyQp8yPGI
DROP TABLE bricks;
create table bricks (
brick_id integer,
colour varchar2(10),
shape varchar2(10),
weight integer,
PRIMARY KEY (brick_id)
);
insert into bricks values ( 1, 'blue', 'cube', 1 );
insert into bricks values ( 2, 'blue', 'pyramid', 2 );
insert into bricks values ( 3, 'red', 'cube', 1 );
insert into bricks values ( 4, 'red', 'cube', 2 );
insert into bricks values ( 5, 'red', 'pyramid', 3 );
insert into bricks values ( 6, 'green', 'pyramid', 1 );
commit;
SELECT * FROM BRICKS b ;
1 blue cube 1
2 blue pyramid 2
3 red cube 1
4 red cube 2
5 red pyramid 3
6 green pyramid 1
SELECT COLOUR, COUNT(*), MIN(WEIGHT), MAX(WEIGHT), AVG(WEIGHT)
FROM BRICKS
GROUP BY COLOUR;
| COLOUR | COUNT(*) | MIN(WEIGHT) | MAX(WEIGHT) | AVG(WEIGHT) |
| ------ | -------- | ----------- | ----------- | ----------- |
| red | 3 | 1 | 3 | 2 |
| green | 1 | 1 | 1 | 1 |
| blue | 2 | 1 | 2 | 1.5 |
-- OVER()는 전체레코드를 대상으로 함.
SELECT B.*,
COUNT(*) OVER () TOTAL_COUNT,
MIN(WEIGHT) OVER() MINW,
MAX(WEIGHT) OVER() MAXW,
AVG(WEIGHT) OVER() AVGW
FROM BRICKS B;
| BRICK_ID | COLOUR | SHAPE | WEIGHT | TOTAL_COUNT | MINW | MAXW | AVGW |
| -------- | ------ | ------- | ------ | ----------- | ---- | ---- | ---------------------------------------- |
| 1 | blue | cube | 1 | 6 | 1 | 3 | 1.66666666666666666666666666666666666667 |
| 2 | blue | pyramid | 2 | 6 | 1 | 3 | 1.66666666666666666666666666666666666667 |
| 3 | red | cube | 1 | 6 | 1 | 3 | 1.66666666666666666666666666666666666667 |
| 4 | red | cube | 2 | 6 | 1 | 3 | 1.66666666666666666666666666666666666667 |
| 5 | red | pyramid | 3 | 6 | 1 | 3 | 1.66666666666666666666666666666666666667 |
| 6 | green | pyramid | 1 | 6 | 1 | 3 | 1.66666666666666666666666666666666666667 |
-- OVER(PARTITION BY 컬럼) 은 같은 컬럼값을 대상으로 함
SELECT B.*,
COUNT(*) OVER (PARTITION BY COLOUR) TOTAL_COUNT,
MIN(WEIGHT) OVER(PARTITION BY COLOUR) MINW,
MAX(WEIGHT) OVER(PARTITION BY COLOUR) MAXW,
AVG(WEIGHT) OVER(PARTITION BY COLOUR) AVGW
FROM BRICKS B;
| BRICK_ID | COLOUR | SHAPE | WEIGHT | TOTAL_COUNT | MINW | MAXW | AVGW |
| -------- | ------ | ------- | ------ | ----------- | ---- | ---- | ---- |
| 2 | blue | pyramid | 2 | 2 | 1 | 2 | 1.5 |
| 1 | blue | cube | 1 | 2 | 1 | 2 | 1.5 |
**| 6 | green | pyramid | 1 | 1 | 1 | 1 | 1 |**
| 5 | red | pyramid | 3 | 3 | 1 | 3 | 2 |
| 4 | red | cube | 2 | 3 | 1 | 3 | 2 |
| 3 | red | cube | 1 | 3 | 1 | 3 | 2 |
-- PARTITION BY {컬럼} ORDER BY {UNIQUE KEY} 은
-- 같은 {컬럼}값을 대상으로 통계를 내며 누적값을 보여줌
SELECT B.*,
COUNT(*) OVER (PARTITION BY COLOUR ORDER BY BRICK_ID) TOTAL_COUNT,
SUM(WEIGHT) OVER (PARTITION BY COLOUR ORDER BY BRICK_ID) SUMW,
MIN(WEIGHT) OVER(PARTITION BY COLOUR ORDER BY BRICK_ID) MINW,
MAX(WEIGHT) OVER(PARTITION BY COLOUR ORDER BY BRICK_ID) MAXW,
AVG(WEIGHT) OVER(PARTITION BY COLOUR ORDER BY BRICK_ID) AVGW
FROM BRICKS B;
| BRICK_ID | COLOUR | SHAPE | WEIGHT | **TOTAL_COUNT** | **SUMW** | MINW | MAXW | AVGW |
| -------- | ------ | ------- | ------ | ----------- | ---- | ---- | ---- | ---- |
| 1 | blue | cube | 1 | 1 | 1 | 1 | 1 | 1 |
| 2 | blue | pyramid | 2 | 2 | 3 | 1 | 2 | 1.5 |
| 6 | green | pyramid | 1 | 1 | 1 | 1 | 1 | 1 |
| 3 | red | cube | 1 | 1 | 1 | 1 | 1 | 1 |
| 4 | red | cube | 2 | 2 | 3 | 1 | 2 | 1.5 |
| 5 | red | pyramid | 3 | 3 | 6 | 1 | 3 | 2 |