2022. 10. 25. 17:55ㆍ[DB]/[Oracle]_DB
개요
테이블에 저장된 날자 정보를 토대로
해당 날자의 저장 횟수 (로그인한 횟수)
접속한 날자의 요일
접속한 날자의 Day 일
을 쿼리를 통해서 추출
사용 함수
해당 날자데이터를 요일로 추출
to_char(createDate,'day') 요일
해당 'YYYY-MM-DD' 형식 데이터를 DD 만 추출
substr(trunc(createDate,'dd'),7,2) dd
해당 'YYYY-MM-DD' 데이터를 날자의 '일' 데이터로 추출
EXTRACT(day from createDate)
그룹핑 이후 얼마나 중복되는지 순번을 매겨주는 함수
row_number() over (partition by createDate order by createDate)
예제
유저접속기록 테이블
원래는 'YYYY-MM-DD' 만
들어가야하는데 형식이 다른 데이터를 예제로 삼기위해 SYSDATE 형식 데이터 추가
날자별 중복되는 값 있을 시 순번을 매겨주는 함수 적용
이 테이블은 접속 기록용 테이블입니다.
2022-10-25 일에 접속한 것과
2022-10-25 15:52:44 또한 같은 일로 취급해야 하나,
똑같은 값이 아니기 때문에 순번이 나눠져서 매겨집니다.
이러면 원하는 값이 나오지 않습니다.
위에서 조회한 결과를 날자 데이터로 그룹화
함수를 적용시켜 원하는 값을 도출합니다.
max 함수를 사용해서 가장 큰값 ( 접속 횟수 )
to_char 를 활용하여
- 'day' -> 일
- 'month' -> 월
- 'year' -> 년
으로 추출합니다.
trunc 함수를 사용해서
DD -> SYSDATE 형식 기준 DD 까지 절삭 후
substr 로 7부터 2글자 까지 를 추출 -> DD 의 부분만 가져옵니다
해당 형식은 10 미만일 경우 앞에 0 이 붙어서 나올 수 있는 장점이 있습니다.
EXTRACT 함수를 사용해서
EXTRACT( 추출할 형식 from 비교 대상)
추출할 형식은 다음과 같습니다.
'day' -> 일
'month' -> 월
'year' -> 년
알아두기
위와같이 이론상으로는 같은 값으로 카운팅 되어 2가 나와야 하는 값이
1과 1로 2가지가 나왔습니다.
이유는 Group by 시, Row_number over ( Partition by) 시
해당 데이터가 동일하지 않다고 판별되서 그런 것입니다.
따라서 테이블 설계 시 혹은 데이터 입력 부분에서 해당 부분을 Vailidate 처리를 해줘야 합니다.
감사합니다.
'[DB] > [Oracle]_DB' 카테고리의 다른 글
[Connect by]_ 계층형 쿼리 & 재귀 쿼리 응용 ( 이달의 휴일 구하기 ) (0) | 2022.11.28 |
---|---|
[connect_by]_ORACLE_계층 형 함수 사용(메뉴트리) (0) | 2022.11.21 |
[Oracle]_NVL 사용 (DATE,Number) 비교 (0) | 2022.08.29 |
[Oracle]SelectKey_사용하기 (feat. SEQUENCE) (0) | 2022.05.24 |
[Oracle]_SEQUENCE (feat. 테이블 pk) (0) | 2022.05.24 |