레코드에 순번을 붙이는 방법을 알아보자
1) 기본키가 한개의 필드일 경우
- 윈도우 함수를 사용
SELECT student_id,
ROW_NUMBER() OVER (ORDER BY student_id) AS seq
FROM Weights;
- 상관 서브쿼리를 사용
SELECT student_id,
(SELECT COUNT(*)
FROM Weights W2
WHERE W2.student_id <= W1.student_id) AS seq
FROM Weights W1
내 뒤에 몇명이 있는지를 세서 나의 번호를 매긴다.. 영리한 코드다...*
키를 where절에 놓고 count(*) 하는것이 포인트!
윈도우 함수를 사용할 수 있는 경우라면, 웬만하면 윈도우 함수를 사용하는게 낫다. 왜냐 상관서브쿼리를 사용하면 테이블을 두번 스캔하니까.
2) 기본키가 여러개의 필드로 구성되는 경우
윈도우 함수 짱짱
SELECT class, student_id,
ROW_NUMBER() OVER (ORDER BY class, student_id) AS seq
FROM Weights2;
- 상관 서브쿼리 사용
SELECT class, student_id,
(SELECT COUNT(*)
FROM Weights2 W2
WHERE (W2.class, W2.student_id)
<= (W1.class, W1.student_id) ) AS seq
FROM Weights2 W1;
위와 같은 방식이다. 다만 키가 추가됐다. 문자열과 숫자라도 가능하다. 암묵적인 자료형 변환도 발생하지 않으므로 기본키 인덱스도 사용할 수 있다!
3) 그룹마다 순번을 붙이는경우
예를들어 학급마다 순번을 붙여보자.
테이블을 그룹으로 나누고 그룹마다 내부 레코드에 순번을 붙이는것!
* 윈도우 함수로 이를 구현하려면 윈도우 함수와 PARTITION BY를 적용해야 한다.
'Today I learned' 카테고리의 다른 글
화면단에서 css Nocash로 가져오기. (0) | 2021.02.25 |
---|---|
2021 02 25 - 순번과 갱신 (0) | 2021.02.25 |
2021 02 19 - 서브쿼리 (0) | 2021.02.19 |
2021 02 16 - SQL과 반복문 (0) | 2021.02.16 |
2021 02 16 - CASE, CASE, CASE (0) | 2021.02.16 |
댓글