[Oracle]_날자 , 요일 추출_그룹 핑 후 순번 매기기

2022. 10. 25. 17:55[DB]/[Oracle]_DB

728x90
반응형

개요

 

테이블에 저장된 날자 정보를 토대로

 

해당 날자의 저장 횟수 (로그인한 횟수)

접속한 날자의 요일

접속한 날자의 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 처리를 해줘야 합니다.

 

감사합니다.

728x90
반응형