-- 윈도우 함수로 이를 구현하려면 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 |
댓글