728x90

javaexpert.tistory.com/503

 

[펌]오라클 OVER() 함수 설명

출처 : http://blog.naver.com/PostView.nhn?blogId=whitefre&logNo=140148769754 ★ OVER()함수란? OVER함수는 ORDER BY, GROUP BY 서브쿼리를 개선하기 위해 나온 함수라고 할 수 있습니다. ★ 전통 SQL 사용 SE..

javaexpert.tistory.com

★ OVER()함수란?

OVER함수는 ORDER BY, GROUP BY 서브쿼리를 개선하기 위해 나온 함수라고 할 수 있습니다.

 

★ 전통 SQL 사용

SELECT YYMM, PRICE
FROM (

SELECT YYMM,

SUM(TOT_PRICE) AS PRICE
FROM TABLE1
GROUP BY YYMM
ORDER BY YYMM DESC

)

 

 OVER 함수 이용

SELECT YYMM,

SUM(TOT_PRICE) OVER(ORDER BY YYMM DESC) AS PRICE
FROM TABLE1

 

 

 COUNT(*)OVER() 사용

실제 데이터와 함께 해당 테이블의 전체 로우 컬럼을 쉽고 편리하게 추출할 수 있다.

 

SELECT MENU_ID, MENU_NAME, COUNT(*) AS TOTALCOUNT
FROM MENU_MG

위의 쿼리를 실행하면 다음과 같은 오류 메시지가 나온다.
ORA-00937: not a single-group group function

 

다음 쿼리로 쉽게 전체 카운트를 추출할 수 있다.

SELECT MENU_ID, MENU_NAME, COUNT(*)OVER() AS TOTALCOUNT
FROM MENU_MG

 

 OVER() 함수

 

COUNT(*)OVER() : 전체행 카운트
COUNT(*)OVER(PARTITION BY 컬럼) : 그룹단위로 나누어 카운트


MAX(컬럼)OVER() : 전체행 중에 최고값
MAX(컬럼)OVER(PARTITION BY 컬럼) : 그룹내 최고값


MIN(컬럼)OVER() : 전체행 중에 최소값
MIN(컬럼)OVER(PARTITION BY 컬럼) : 그룹내 최소값


SUM(컬럼)OVER() : 전체행 합
SUM(컬럼)OVER(PARTITION BY 컬럼) : 그룹내 합


AVG(컬럼)OVER() : 전체행 평균
AVG(컬럼)OVER(PARTITION BY 컬럼) : 그룹내 평균


STDDEV(컬럼)OVER() : 전체행 표준편차
STDDEV(컬럼)OVER(PARTITION BY 컬럼) : 그룹내 표준편차


RATIO_TO_REPORT(컬럼)OVER() : 현재행값/SUM(전체행값) 퍼센테이지로 나타낼경우 100곱하면 됩니다.
RATIO_TO_REPORT(컬럼)OVER(PARTITION BY 컬럼) : 현재행값 / SUM(그룹행값) 퍼센테이지로 나타낼경우 100곱하면 됩니다.

======================================================================

 

COUNT(expr) OVER(analytic_clause)

- 같거나 작은 조건에 대한 갯수 반환

 

/* 부서번호가 50인 부서 지원에 대해 각 직원의 급여보다 같거나 적게 받는 사람에 대한 누적 합을 반환. */

SELECT employee_id, salary

, COUNT(*) over(ORDER BY salary) AS "Count"

FROM employees

WHERE department_id = '50';

 

SUM(expr) OVER(analytic_clause)

-- 같거나 작은 값들에 대한 누적

/* 특정 값을 누적하여 결과를 보여준다. */

SELECT employee_id, salary

, SUM(salary) over(ORDER BY employee_id)

FROM employees

WHERE department_id = '50';

 

/* 위 예제에 더해 부서별 누적 결과를 함께 보고자 한다. */

SELECT employee_id, department_id, salary

, SUM(salary) over(ORDER BY department_id, employee_id)

, SUM(salary) over(partition by department_id order by employee_id)

FROM employees;

 

 

RANK() OVER()

--순위

SELECT SAL_SNO, SAL_YYMM, SAL_TOTAL,

RANK() OVER(ORDER BY SAL_TOTAL) AS "CONT"

FROM TB_SALARY

WHERE SAL_YYMM = '201101';

 

DENSE_RANK 함수

- 값의 그룹에서 값의 순위를 계산합니다. RANK와는 달리 같은 순위가 둘 이상 있어도 다음 순위는 1만 증가하여 반환.

 

SELECT employee_id, department_id, salary

, DENSE_RANK() over(PARTITION BY department_id ORDER BY salary DESC)

FROM employees

WHERE department_id = '50'

 

 

 ROW_NUMBER() OVER- 특정 컬럼 기준으로 순위정하기(행번호 부여하기)

SELECT T.MAIN_CODE
, T.GOODS_SEQ
, T.OFFER_MASTER_SEQ
, MODEL_CD
, (ROW_NUMBER() OVER(PARTITION BY T.MAIN_CODE ORDER BY T.MAIN_CODE, T.GOODS_SEQ, T.OFFER_MASTER_SEQ)) RANK

-- , (ROW_NUMBER() OVER(PARTITION BY 중복조회컬럼 ORDER BY 정렬컬럼1, 정렬컬럼2, ...))
FROM TMP_TABLE T

 

결과

MAIN_CODE GOODS_SEQ OFFER_MASTER_SEQ MODEL_CD RANK

--------------------------------------------------------------

1 1 1 AAA 1

1 1 2 AAA 2

1 2 4 BBB 3

1 2 5 BBB 4

2 1 1 AAA 1

2 1 4 AAA 2

2 2 5 BBB 3

2 2 6 BBB 4

2 3 7 CCC 5

2 3 9 CCC 6

 

 

★ 특정 column의 값을 기준으로 레코드의 순서정하여 정렬하기.

TEAM_CD SCORE PALY_DATE

------------------------------

AAA 90 2010/08/01

AAA 50 2010/08/02

AAA 60 2010/08/03

AAA 50 2010/08/04

BBB 50 2010/08/01

BBB 90 2010/08/02

BBB 95 2010/08/03

BBB 100 2010/08/04

 

방법 1. RANK() OVER

SELECT T.TEAM_CD, T.SCORE, RANK() OVER(ORDER BY SCORE DESC) RANK, T.PLAY_DATE
FROM TMP_TABLE T

 

결과

TEAM_CD SCORE RANK PALY_DATE

------------------------------

BBB 100 1 2010/08/04

BBB 95 2 2010/08/03

AAA 90 3 2010/08/01

BBB 90 3 2010/08/02

AAA 60 5 2010/08/03

AAA 50 6 2010/08/02

AAA 50 6 2010/08/04

BBB 50 6 2010/08/01

 

방법 2. ROW_NUMBER() OVER

SELECT T.TEAM_CD, T.SCORE, ROW_NUMBER() OVER(ORDER BY SCORE DESC) RANK, T.PLAY_DATE
FROM TMP_TABLE T

 

결과

TEAM_CD SCORE RANK PALY_DATE

------------------------------

BBB 100 1 2010/08/04

BBB 95 2 2010/08/03

AAA 90 3 2010/08/01

BBB 90 4 2010/08/02

AAA 60 5 2010/08/03

AAA 50 6 2010/08/02

AAA 50 7 2010/08/04

BBB 50 8 2010/08/01

 

방법 3. DENSE_RANK() OVER

SELECT T.TEAM_CD, T.SCORE, DENSE_RANK() OVER(ORDER BY SCORE DESC) RANK, T.PLAY_DATE
FROM TMP_TABLE T

 

결과

TEAM_CD SCORE RANK PALY_DATE

------------------------------

BBB 100 1 2010/08/04

BBB 95 2 2010/08/03

AAA 90 3 2010/08/01

BBB 90 3 2010/08/02

AAA 60 4 2010/08/03

AAA 50 5 2010/08/02

AAA 50 5 2010/08/04

BBB 50 5 2010/08/01

 

 

 

★ 분석용 함수

RANK - 해당값에 대한 우선순위를 결정 (중복 우선순위 허용)

DENSE_RANK - 해당값에 대한 우선순위를 결정 (중복 우선순위 허용 안함)

ROW_NUMBER - 조건을 만족하는 모든 행의 번호를 제공

CUME_DIST - 분산값

PERCENT_RANK - 백분율

NTILE(n) - 전체 데이터 분포를 n-Buckets으로 나누어 표시

FIRST_VALUE - 정렬된 값중에서 첫번째 값을 반환.

LAST_VALUE - 정렬된 값중에서 마지막 값을 반환.

 

★ OVER() 에 사용되는 OPTION

1. PARTITION BY
2. ORDER BY DESC
3. NULLS FIRST : NULL 데이터를 먼저 출력.
4. NULLS LAST : NULL 데이터를 나중에 출력.

[출처] 오라클 OVER() 함수 |작성자 whitefre

 

 

728x90

'Dev > DB' 카테고리의 다른 글

[MySQL] Linux 언어설정 변경 (LATIN 1 -> EUCKR)  (0) 2020.07.20
[MySQL] 다중 update 쿼리 방법  (0) 2020.07.07
[MySQL] batch작업  (0) 2020.07.02
[MySQL/Oracle] Merge Into 관련 (ON DUPLICATE KEY)  (0) 2020.06.30
[MyBatis] Like 처리 방법  (0) 2020.06.30
728x90

@JvmField
Compiler에게 자동으로 getter/setter를 만들지 말라는 표시

@JvmStatic
Compiler에게 자동으로 static getter/setter를 만들라는 어노테이션, 함수일 경우에는 static 함수가 만들어진다.

companion object {
       @JvmStatic lateinit var instance: PokemonApplication
       @JvmStatic lateinit var appComponent: AppComponent
}


companion object안에서는 사용할 필요가 없다.

자바 코드로 보면 아래와 같다.
@NotNull
public static PokemonApplication instance;
@NotNull
public static AppComponent appComponent;

 

 

[출처] Kotlin 학습 - @JvmField, @JvmStatic|작성자 vicfaith

728x90
728x90

 

https://beomseok95.tistory.com/89

 

Kotlin - null 가능성, lateinit ,lazy

Kotlin - null 가능성, lateinit, lazy null 가능성 기본적으로 객체를 불변으로 보고 null값을 허용하지 않습니다. null값을 호용하려면 별도의 연산자가 필요하고 null을 허용한 자료형을 사용할 때도 별도

beomseok95.tistory.com

 

null 가능성

기본적으로 객체를 불변으로 보고 null값을 허용하지 않습니다.

null값을 호용하려면 별도의 연산자가 필요하고 null을 허용한 자료형을 사용할 때도 별도의 연산자들을 사용하여 안전하게 호출해야 합니다.

 

null 허용?

코틀린에서 기본적으로 null 값을 허용하지 않습니다 .따라서 모든 객체는 생성과 동시에 값을 대입하여 초기화 해야합니다.

 

아래 코드는 초기화 하지 않아 에러가 발생합니다.

 

val a:String

에러 Property must be initialized or be abstract

Compilation Error

 

다음 코드는 null 값으로 초기화 해서 에러가 발생합니다.

 

val a: String =null

Null can not be a value of a non-null type String

Compilation Error

 

코틀린에서 null 값을 허용하려면 자료형의 오른쪽에 ? 기호를 붙여주면 됩니다.

아래 코드는 null값을 허용하는 String 객체이기 때문에 에러가 발생하지 않습니다.

 

val a:String=null

 

자바에서는 int, long, double과 같은 프리미티브 자료형은 null 값을 허용하지 않습니다만,

그외 모든 클래스형 변수는 null값을 허용합니다.

 

 

lateinit 키워드를 사용한 늦은 초기화

안드로이드를 개발할 때는 초기화를 나중에 할 경우가 있습니다. 이때는 lateinit 키워드를 변수 선언 앞에 추가하면 됩니다. 안드로이드에서는 특정 타이밍에 객체를 초기화할 때 사용합니다.

초기화를 잊는다면 잘못된 null값을 참조하여 앱이 종료될 수 있으니 주의해야 합니다.

lateinit var a:String //OK

 

="hello"

println(a) //hello

 

 

 

lateinit은 다음 조건에서만 사용할 수 있습니다

1) var 변수에서만 사용합니다.

2) null 값으로 초기화 할 수 없습니다.

3) 초기화 전에는 변수를 사용할 수 없습니다

4) Int, Long, Double, Float에는 사용할 수 없습니다.

 

 

lazy로 늦은 초기화

lateinit이 var로 선언한 변수의 늦은 초기화라면 lazy는 값을 변경할 수 없는 val을 사용할 수 있습니다. val 선언 뒤에 by lazy 블록에 초기화에 필요한 코드를 작성합니다. 마지막 줄에는 초기화 할 값을 작성합니다. 마지막 줄에는 초기화 할 값을 작성합니다.

str이 처음 호출될 때 초기화 블록의 코드가 실행됩니다. println() 메소드로 두번 호출하면 처음에만 "초기화"가 출력됩니다.

val str:String by lazy{

        println("초기화")

        "hello"

}

 

println(str) // 초기화; hello

println(str) //hello

 

lazy로 늦은 초기화를 하면 앱이 시작될 때 연산을 분산시킬 수 있어 빠른 실행에 도움이 됩니다.

 

 

lazy는 다음 조건에서만 사용할 수 있습니다.

1) val 에서만 사용합니다.

 

조건이 적기 때문에 상대적으로 lateinit 보다 편하게 사용할 수 있습니다.

728x90
728x90

안드로이드 기기에서 자료를 저장하는 방법은 크게 다음 4가지가 있다.  (온라인 전송은 논외이므로 제외)

1. 내부저장장치 InternalStorage
2. 외부저장장치 ExternalStorage
3. DB 저장 : SQLite
4. SharedPreferences

 

---------------------------------------------------------------------------------------------
1.안드로이드의 내부저장장치 (InternalStorage)

기본적으로 자바의 파일 입출력 스트림을 사용하며, openFileOutput()  과 openFileInput() 을 사용하여 안드로이드 내부 저장장치 에 파일을 생성하여 쓰고 읽기를 합니다.

 

참고: 외부 저장소 디렉터리와 달리 앱은 이러한 메서드에 의해 반환된 내부 디렉터리를 읽고 쓰는 데 시스템 권한이 필요하지 않습니다.

 

getFilesDir()앱의 내부 디렉터리를 나타내는 File을 반환합니다.

getCacheDir() 앱의 임시 캐시 파일의 내부 디렉터리를 나타내는 File을 반환합니다. 더 이상 필요하지 않은 파일을 모두 삭제하고 언제든지 사용할 수 있는 메모리 양에 관해 합리적인 크기 제한(예: 1MB)을 구현해야 합니다.

주의: 저장용량이 부족하면 시스템은 경고 없이 캐시 파일을 삭제할 수 있습니다.

 

 

Caution: On devices that run Android 7.0 (API level 24) or higher, unless you pass the Context.MODE_PRIVATE file mode into openFileOutput(), a SecurityException occurs.

 

openFileOutput() 메서드에는 파일 모드 매개변수가 필요합니다. MODE_PRIVATE을 전달하면 파일이 비공개로 앱에 전달됩니다. 다른 모드 옵션인 MODE_WORLD_READABLE  MODE_WORLD_WRITEABLE은 API 레벨 17부터 더 이상 사용되지 않습니다. Android 7.0(API 레벨 24)부터는 Android에서 이러한 옵션이 사용되면 SecurityException이 발생합니다. 앱이 다른 앱과 비공개 파일을 공유해야 한다면 FLAG_GRANT_READ_URI_PERMISSION 속성과 함께 FileProvider를 대신 사용해야 합니다. 자세한 내용은 파일 공유를 참조하세요.

Android 6.0(API 레벨 23) 이하에서는 누구든지 읽을 수 있도록 파일 모드(MODE_WORLD_READABLE)를 설정하면 다른 앱이 내부 파일을 읽을 수 있습니다. 하지만 다른 앱이 개발자 앱의 패키지 이름 및 파일 이름을 알아야 읽을 수 있습니다. 파일을 읽기 가능 또는 쓰기 가능으로 명시적으로 설정하지 않으면 다른 앱은 개발자 앱의 내부 디렉터리를 탐색할 수 없으며 읽기 또는 쓰기 권한도 갖지 못합니다. 따라서 내부 저장소의 파일에 MODE_PRIVATE을 사용하는 한 다른 앱이 이러한 파일에 액세스할 수 없습니다.

 

Reference

https://codedragon.tistory.com/353

https://bitsoul.tistory.com/tag/안드로이드저장장치 내부저장장치 InternalStorage openFileInput openFileOutput

https://developer.android.com/training/data-storage/files/internal?hl=ko

 

 

 

728x90

+ Recent posts