본문 바로가기

SQL

(6)
[SQL] FIRST_VALUE / LAST_VALUE FIRST_VALUE window의 가장 첫번째에 위치한 데이터를 가져온다. partition by는 생략 가능하지만, order by는 반드시 필요하다. window절은 생략 가능. 생략시 range between unbounded precding and current row select empno, ename, deptno, hiredate, sal , first_value(sal) over (partition by deptno order by hiredate) as first_hiredate_sal from hr.emp; LAST_VALUE window의 가장 마지막에 위치한 데이터를 가져온다. window절이 rows between unbounded preceding and unbounded fo..
[SQL] LEAD, LAG 이란? LEAD) select empno, deptno, hiredate, ename , lag(ename) over (partition by deptno order by hiredate) as prev_ename from hr.emp; LAG) select empno, deptno, hiredate, ename , lead(ename) over (partition by deptno order by hiredate) as prev_ename from hr.emp;
[SQL] 순위 함수(RANK, DENSE_RANK, ROW_NUMBER) 사용 시 NULL 처리 방법 개요 NULL값이 들어간 데이터에 순위를 매기려고 하니 NULL을 먼저 순위로 매기는 현상이 있다. select * , rank() over (order by comm desc )as comm_rank , dense_rank() over (order by comm desc )as comm_dense_rank , row_number() over (order by comm desc )as comm_row_number from hr.emp; 순위 함수 사용 시 NULL 처리 방법 실습 NULLS FIRST select * , rank() over (order by comm desc nulls first)as comm_rank from hr.emp; NULLS FIRST를 사용하지 않은 기본 형식과 동일하게 적..
[SQL] 순위 함수(RANK, DENSE_RANK, ROW_NUMBER) 순위함수 종류 지금은 RANK, DENSE_RANK, ROW_NUMBER를 알아보자 RANK, DENSE_RANK, ROW_NUMBER 특징 실습 기본예제 select empno , hiredate , rank() over (order by hiredate desc) , dense_rank() over (order by hiredate desc) , row_number() over (order by hiredate desc) from hr.emp; 함수 별로 순위를 매기는 차이가 있는 것을 확인할 수 있다. PARTITION BY 사용하여 순위 매기기 부서별 급여가 높은 순으로 순위 매기기 : 공동 순위 시 차순위는 밀리지 않음 select a.empno , a.ename , a.deptno , a.sa..
[SQL] Analytic SQL GROUP BY, 집계 함수 차이 Analytic SQL 유형 Analytic SQL 특징 Window절 안에 들어갈 내용은 다음과 같다. Window 절의 상세 구문 구문 구문 설명 ROWS | RANGE Rows : 물리적인 row를 의미. Range : 논리적인 row를 의미. Order by 절이 없으면 기술할 수 없음. BETWEEN ... AND Window의 시작과 종료 지점을 기술. Between 다음이 시작 지점 And 다음이 종료 지점. UNBOUNDED PRECEDING Partition의 첫번째 row부터 시작함을 기술. Window의 종료점으로는 사용될 수 없음. UNBOUNDED FOLLOWING Partition의 마지막 row에서 종료됨을 기술. Window의 시작점으로는 사..
[SQL] GROUP BY : CASE WHEN을 이용하여 피봇팅하기 기존 테이블 select * from hr.emp; 취업연도 별 평균 급여 구하기 select to_char(hiredate, 'yyyy') as hire_year , avg(sal) as avg_sal from hr.emp group by to_char(hiredate, 'yyyy') order by 1; 직업 별 인원 구하기 'SALESMAN'은 'SALESMAN'으로 그 외는 'OTHERS'로 분류하고 인원 구하기 select case when job = 'SALESMAN' then 'SALESMAN' else 'OTHERS' end as job_gubun , count(*) from hr.emp group by case when job = 'SALESMAN' then 'SALESMAN' else ..