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    |