본문 바로가기
Today I learned

2021 02 25 - 순번과 갱신

by soheemon 2021. 2. 25.

-- 윈도우 함수로 이를 구현하려면 class 필드에 PARTITION BY로 적용해준다.

-- 학급마다 순번을 붙이는 경우
SELECT class, student_id,
       ROW_NUMBER() OVER (PARTITION BY class ORDER BY student_id) AS seq
 FROM Weights2;

-> class별로 묶어서, ROW_NUMBER()로 그룹내에서 순번을 먹여준다.

 

-- 상관서브쿼리를 사용하는방법

SELECT class, student_id,
       (SELECT COUNT(*)		--의 개수를 세는것이 포인트
          FROM Weights2 W2
         WHERE W2.class = W1.class
           AND W2.student_id <= W1.student_id) AS seq	-- 나보다 뒤에있는애
 FROM Weights2 W1;

 

# 갱신

순번할당번호를 새 필드로 만들고,

윈도우함수로 만든 순번을 해당 필드에 update 해보자-

UPDATE Weights3
   SET seq = (SELECT seq
                FROM (SELECT class, student_id,
                             ROW_NUMBER()
                               OVER (PARTITION BY class
                                         ORDER BY student_id) AS seq
                        FROM Weights3
                      ) SeqTbl
             -- SeqTbl라는 서브쿼리를 만들어야 함
               WHERE Weights3.class = SeqTbl.class
                 AND Weights3.student_id = SeqTbl.student_id
             );

상관서브쿼리를 사용해서도 만들어보자-

UPDATE Weights3
   SET seq = (
     SELECT count(1) FROM Weights3 W2
     WHERE 1=1
     AND W2.class = Weights3.class
     AND W2.student_id <= Weights3.student_id
     
             );

 

# 중앙값 찾기

SELECT W1.weight
          FROM Weights W1, Weights W2
         GROUP BY W1.weight
            -- S1(하위 집합)의 조건
        HAVING SUM(CASE WHEN W2.weight >= W1.weight THEN 1 ELSE 0 END) >= COUNT(*) / 2
            -- S2(상위 집합)의 조건
           AND SUM(CASE WHEN W2.weight <= W1.weight THEN 1 ELSE 0 END) >= COUNT(*) / 2 

아! ㅠ GROUP BY + HAVING + CASE 때문에 멘붕온다

'Today I learned' 카테고리의 다른 글

2021 03 02 -  (0) 2021.03.02
화면단에서 css Nocash로 가져오기.  (0) 2021.02.25
2021 02 19 - SQL의 순서  (0) 2021.02.19
2021 02 19 - 서브쿼리  (0) 2021.02.19
2021 02 16 - SQL과 반복문  (0) 2021.02.16

댓글