블로그 이미지
SITD

카테고리

분류 전체보기 (34)
1.DB (4)
2.OS (3)
3.PROGRAMMING (14)
4.학업 (0)
5.영어 (0)
6.KSIT (5)
7.증권 (1)
8.EXCEL (0)
9.Graduate (2)
기타 (5)
Total
Today
Yesterday

달력

« » 2024.4
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

공지사항

태그목록

최근에 올라온 글


윈도우는 case sensitive가 없다,
하지만 리눅스는 case sensitive가 있다.

예를 들어 cd abcd란 명령이 있다고 할때,
윈도우 : cd abcd (O)
            CD abcd (O)

리눅스 : cd abcd (O)
            CD abcd (X)

이렇게 된다. 즉 동일한 커맨드일 때, 오타가 아닌 대소문자 문제라면 윈도우에선 정상작동, 리눅스에선 오작동이 일어난다.

이유를 들자면,
리눅스 : 유닉스에서 나온것이고, 유닉스는 C에서 출발한 것이며, C는 case sensitive가 된다.
윈도우 : 도스엔 to_upper()만 지원했다. 즉 파일이름은 무조건 대문자였고, 이 전통이 이어져 내려왔기 때문에 case sensitive가 없다.

참고 : Why is linux case sensitive?
          (http://www.linuxquestions.org/questions/linux-general-1/why-is-linux-case-sensitive-125995/
case : 경우, 실정, 사실, 사건, 병상

'2.OS > UNIX/LINUX' 카테고리의 다른 글

리눅스에서 vi 커맨드 모드 사용하기  (0) 2012.09.03
공유메모리 관련한 메모리 이슈  (0) 2011.09.21
Posted by SITD
, |
가장 기본적인 EMP테이블에서 부서별로 MAX와 MIN 값을 구해보자

<분석함수 버전>

SELECT A.deptno, A.empno, A.sal, B.empno, B.sal
  FROM (SELECT t.*,
  ROW_NUMBER() OVER(PARTITION BY deptno ORDER BY sal DESC) AS rn
      FROM EMP T
) A,
(SELECT t.*,
  ROW_NUMBER() OVER(PARTITION BY deptno ORDER BY sal ASC) AS rn
      FROM EMP T
) B
 WHERE A.deptno = B.deptno
  AND A.rn = 1
  AND B.rn = 1


10 7839 5000 7934 1300
20 7788 3000 7369 800
30 7698 2850 7900 950



<MAX KEEP 버전> 

SELECT deptno,
MAX(empno) KEEP(DENSE_RANK FIRST  ORDER BY sal desc) as empno,
MAX(sal) AS max_sal,
MIN(empno) KEEP(DENSE_RANK FIRST  ORDER BY sal Asc) as empno,
min(sal) AS min_sal
  FROM EMP
 GROUP BY deptno


10 7839 5000 7934 1300
20 7902 3000 7369 800
30 7698 2850 7900 950
9001 9000



출처 : 오라클 KEEP
         (http://tortoiselfish.springnote.com/pages/5897823?print=1

keep(dense_rank {last|first} order by <>) , over(partition by XX)

 먼저 keep(dense_rank first order by )함수

A 컬럼 기준 정렬 후 지정 된 행의 B 컬럼 값 추출 하기

first나 last로 order by 한 로우에서 첫번째 혹은 마지막로우를 가져온다

 

MIN(B) (DENSE_RANK FIRST ORDER BY A [ASC|DESC])

MAX(B) (DENSE_RANK LAST ORDER BY A [ASC|DESC])

 

오라클 클럽에서 발췌한 퀴즈를 풀면서 알게 되었다는... 스칼라서브쿼리를 생각했었는데 저런 방법도 있었구나.. ㅎ

참 배울게 많다

 

--참고자료(http://3030.tistory.com/88)
구문
【형식】

집합함수 KEEP (
 DENSE_RANK FIRST ORDER BY
    expr [DESC|ASC][NULL{FIRST|LAST}],...)

 

field1    field2
1    c
2    b
3    a

SQL> select MIN(field1), MIN(field2) KEEP(DENSE_RANK FIRST ORDER BY field1) AS field2 from table1
결과>1, c

SQL> select MAX(field1), MAX(field2) KEEP(DENSE_RANK LAST ORDER BY field1) AS field2 from table1
결과> 3 , a

 

 

--참고자료(http://tong.nate.com/rahxephon/35087891)

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곱하면 됩니다.

 

오라클 클럽 문제

[퀴즈] 분석함수의 이해

구분1, 구분2, 날짜, 값으로 구성된 테이블이 있습니다.
구분1, 구분2 그룹으로 최종날짜와 금액합계를 구하고,
구분1별 최종날짜와 그에 해당하는 구분2값과 금액합계를 구하시오.

WITH t AS
(
SELECT 'A' gb1, '01' gb2, '20100601' dt, 10 v FROM dual
UNION ALL SELECT 'A', '01', '20100604', 20 FROM dual
UNION ALL SELECT 'A', '02', '20100603', 30 FROM dual
UNION ALL SELECT 'A', '03', '20100602', 40 FROM dual
UNION ALL SELECT 'B', '01', '20100601', 50 FROM dual
UNION ALL SELECT 'B', '02', '20100605', 60 FROM dual
UNION ALL SELECT 'B', '03', '20100603', 70 FROM dual
UNION ALL SELECT 'B', '04', '20100602', 80 FROM dual
)
SELECT * FROM t
;

 

 

 


 

==정답

SELECT gb1
    , gb2
    , MAX(dt) dt
    , SUM(v) v
    , MAX(MAX(dt)) OVER(PARTITION BY gb1) max_dt
    , MAX(gb2) KEEP(DENSE_RANK LAST ORDER BY MAX(dt)) OVER(PARTITION BY gb1) max_dt_gb2
    , MAX(SUM(v)) KEEP(DENSE_RANK LAST ORDER BY MAX(dt)) OVER(PARTITION BY gb1) max_dt_v
  FROM t
 GROUP BY gb1, gb2
 ORDER BY gb1, gb2
;

 

with t as
(
select 'A' bg1, '01' gb2 , '20100601' dt, 10 v from dual
union all select 'A','01','20100604', 20 from dual
union all select 'A','02','20100603', 30 from dual
union all select 'A','03','20100602', 40 from dual
union all select 'B','01','20100601', 50 from dual
union all select 'B','02','20100605', 60 from dual
union all select 'B','03','20100603', 70 from dual
union all select 'B','04','20100602', 80 from dual
)
select bg1, gb2, max(dt), sum(v),
(select max(dt) from t where bg1 =a.bg1) max_dt,
max(max(dt)) over(partition by bg1),
min(gb2) keep(dense_rank last order by max(dt)) over(partition by bg1) max_dt_gb2,
max(sum(v)) keep(dense_rank last order by max(dt)) over(partition by bg1) max_dt_v,
(select sum(v) from t where dt = (select max(dt) from t where bg1 =a.bg1)) nax_dt_v from t a
group by  bg1, gb2














 

'1.DB > SQL' 카테고리의 다른 글

NULLS FIRST/LAST  (0) 2011.04.25
Posted by SITD
, |
결론만 간단히, .h파일에 넣어서 처리했다.

템플릿 함수의 경우 h에 선언을 넣고 cpp에 정의를 넣었을 때,

오브젝트 파일 만들 때는 오류가 발생하지 않지만, 다른 소스에서 해당 헤더를 참조하여 컴파일할 때 오류가 발생한다.

이런 함수는 선언된 적이 없다는 오류인데(undefined reference to), 

해결 방법은 3가지 정도 있는 듯 하다

1. template(typename T> 위에 export를 둔다

2. #include "xx.cpp" 를 추가한다.

3. 헤더 파일이 구현 부를 넣는다.

이중 1번은 export를 수행하는 컴파일러가 있는지 없는지도 불분명할 정도로 보편적이지 않고, 옳지 않다는 의견이 많다.
2번은 표준에 상당히 위배된 느낌이라서 3번을 사용했다.
템플릿 함수의 특성 때문에 헤더 파일에 소스를 추가할 경우, 확장자를 hpp로 하자는 의견도 있는데(출처 2) 여기까진 안했다.

컴파일 할 때 순서에 따른 문제가 아닐까 싶은데, 정확한 원인은 모르겠다.
단지, 템플릿 함수는 컴파일 타임에 템플릿 함수를 호출하는 객체들의 형태에 맞는 소스를 만든다고 들었다
(즉, typename T로 int, float, double이 들어간다면, 3가지 타입의 함수를 자동으로 만든다)
이게 .h에 있을 땐 가능한데(정확힌 include됐을 때), .cpp에 있을 땐 컴파일 타임에 못 만드는게 아닐까 싶다.



출처 1 :  http://ttriton.tistory.com/tag/undefined%20reference%20to
출처 2 :  
http://kldp.org/node/47258 
Posted by SITD
, |

최근에 달린 댓글

글 보관함