본문 바로가기
Today I learned

2021 02 19 - SQL의 순서

by soheemon 2021. 2. 19.

레코드에 순번을 붙이는 방법을 알아보자

 

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

댓글