꿈을 실현합니다.

Posted
Filed under IT/데이터베이스
문법

집계함수(분석함수)
   KEEP
   (DENSE_RANK FIRST ORDER BY
    expr [ DESC | ASC ]
         [ NULLS { FIRST | LAST } ]
    [, expr [ DESC | ASC ]
            [ NULLS { FIRST | LAST } ]
    ]...
   )
   [ OVER ( [query_partition_clause] ) ]

오라클에서 지원하는 FIRST, LAST 함수에 대해 알아보자.
-- LAST 함수는 ORDER BY 에 의해 정렬된 컬럼값 중 마지막 컬럼값을 (MAX 값을 가져오는 게 아님)
-- FIRST 함수는 첫번째 컬럼값을 가져온다.
-- 아래 경우는 파티션은 GUBUN 컬럼으로 하고, SEQ 컬럼으로 정렬하여 첫번째 및 마지막 VALUE를 가져온다.
-- 부연설명 : GUBUN을 파티션으로 하여, LAST인 경우 각각 SEQ = 10, SEQ = 4인 경우의 VALUE 값을 가져옴
-- 참고사항1 : 이 경우 LAST / FIRST 함수는 OVER절과 같이 쓰여 분석함수로서 기능했다.
-- 참고사항2 : 분석함수로 사용된 MAX, MIN, SUM, AVG는 종류에 관계없이 첫번째/마지막 값을 가져오므로 결과는 서로 동일하다.

WITH TMP AS (
SELECT 10 SEQ, 'A' GUBUN, 40 VALUE FROM DUAL UNION ALL
SELECT 8 SEQ, 'A' GUBUN, 20 VALUE FROM DUAL UNION ALL
SELECT 6 SEQ, 'A' GUBUN, 30 VALUE FROM DUAL UNION ALL
SELECT 4 SEQ, 'B' GUBUN, 45 VALUE FROM DUAL UNION ALL
SELECT 3 SEQ, 'B' GUBUN, 70 VALUE FROM DUAL UNION ALL
SELECT 2 SEQ, 'B' GUBUN, 71 VALUE FROM DUAL
)
SELECT SEQ, GUBUN, VALUE
, MAX(VALUE) KEEP(DENSE_RANK LAST ORDER BY SEQ) OVER(PARTITION BY GUBUN) LAST_VALUE1
, MIN(VALUE) KEEP(DENSE_RANK LAST ORDER BY SEQ) OVER(PARTITION BY GUBUN) LAST_VALUE2
, SUM(VALUE) KEEP(DENSE_RANK LAST ORDER BY SEQ) OVER(PARTITION BY GUBUN) LAST_VALUE3
, AVG(VALUE) KEEP(DENSE_RANK LAST ORDER BY SEQ) OVER(PARTITION BY GUBUN) LAST_VALUE4
, MAX(VALUE) KEEP(DENSE_RANK FIRST ORDER BY SEQ) OVER(PARTITION BY GUBUN) FIRST_VALUE1
, MIN(VALUE) KEEP(DENSE_RANK FIRST ORDER BY SEQ) OVER(PARTITION BY GUBUN) FIRST_VALUE2
, SUM(VALUE) KEEP(DENSE_RANK FIRST ORDER BY SEQ) OVER(PARTITION BY GUBUN) FIRST_VALUE3
, AVG(VALUE) KEEP(DENSE_RANK FIRST ORDER BY SEQ) OVER(PARTITION BY GUBUN) FIRST_VALUE4
FROM TMP;

SEQ GUBUN VALUE LAST_VALUE1 LAST_VALUE2 LAST_VALUE3 LAST_VALUE4 FIRST_VALUE1 FIRST_VALUE2 FIRST_VALUE3 FIRST_VALUE4

10 A 40 40 40 40 40 30 30 30 30
8 A 20 40 40 40 40 30 30 30 30
6 A 30 40 40 40 40 30 30 30 30
4 B 45 45 45 45 45 71 71 71 71
3 B 70 45 45 45 45 71 71 71 71
2 B 71 45 45 45 45 71 71 71 71




-- 아래는 FIRST / LAST 함수가 집계함수로서 기능했다.
-- 집계함수로서 기능할 경우 GROUP BY 절을 반드시 명시해야 한다.
-- MAX/MIN 값과 FIRST / LAST 함수값이 서로 다른 것을 확인 할 수 있다.
-- FIRST / LAST 함수는 앞에 기술된 집계함수가 무엇인지 중요하지 않으며, 
-- ORRDER BY 한 이후,  첫 번째 컬럼이냐, 마지막 컬럼이냐가 중요할 뿐이다.
-- 아래 LAST 경우 SEQ로 정렬하면 GUBUN별 마지막 컬럼은 SEQ = 10, 4 이다.
-- 아래 FIRST 경우 SEQ로 정렬하면 GUBUN별 첫번째 컬럼은 SEQ = 6, 2 이다.
-- 그러므로 첫번째 값과 마지막 값만 출력한다.
WITH TMP AS (
SELECT 10 SEQ, 'A' GUBUN, 40 VALUE FROM DUAL UNION ALL
SELECT 8 SEQ, 'A' GUBUN, 20 VALUE FROM DUAL UNION ALL
SELECT 6 SEQ, 'A' GUBUN, 30 VALUE FROM DUAL UNION ALL
SELECT 4 SEQ, 'B' GUBUN, 45 VALUE FROM DUAL UNION ALL
SELECT 3 SEQ, 'B' GUBUN, 70 VALUE FROM DUAL UNION ALL
SELECT 2 SEQ, 'B' GUBUN, 71 VALUE FROM DUAL
)
SELECT  GUBUN
       , MAX(VALUE) MAX_VALUE
       , MIN(VALUE) MIN_VALUE
       , MAX(VALUE)KEEP (DENSE_RANK LAST ORDER BY SEQ) LAST_VALUE1
       , MIN(VALUE)KEEP (DENSE_RANK LAST ORDER BY SEQ) LAST_VALUE2
       , SUM(VALUE)KEEP (DENSE_RANK LAST ORDER BY SEQ) LAST_VALUE3
       , AVG(VALUE)KEEP (DENSE_RANK LAST ORDER BY SEQ) LAST_VALUE4
       , MAX(VALUE)KEEP (DENSE_RANK FIRST ORDER BY SEQ) FIRST_VALUE1
       , MIN(VALUE)KEEP (DENSE_RANK FIRST ORDER BY SEQ) FIRST_VALUE2
       , SUM(VALUE)KEEP (DENSE_RANK FIRST ORDER BY SEQ) FIRST_VALUE3
       , AVG(VALUE)KEEP (DENSE_RANK FIRST ORDER BY SEQ) FIRST_VALUE4
    FROM TMP
GROUP BY GUBUN;

GUBUN    MAX_VALUE    MIN_VALUE    LAST_VALUE1    LAST_VALUE2    LAST_VALUE3    LAST_VALUE4    FIRST_VALUE1    FIRST_VALUE2    FIRST_VALUE3    FIRST_VALUE4

A    40    20    40    40    40    40    30    30    30    30
B    71    45    45    45    45    45    71    71    71    71


2016/11/02 18:35 2016/11/02 18:35
Posted
Filed under 정보
윈도우 10의 잠금화면에 사용되는 배경이 맘에 드는 것이 많았다.
대체 어떤곳에 저장되는지 궁금해 하다가 최근에서야 인터넷 검색을 통해 알아내게 됐다.
해당 파일의 위치는 아래와 같다.

%localappdata%\Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\LocalState\Assets

위 디렉토리에 알수없는 파일명으로 여러개의 파일이 저장되어 있는데, 이파일을 임시디렉토리에 복사한 뒤, 확장자를  jpg로 바꾸면, 이미지 파일로 저장되어 있는 "잠금화면"을 찾아낼 수 있다.
2016/08/11 14:02 2016/08/11 14:02
Posted
Filed under IT/데이터베이스
WITH TMP AS
     (SELECT '홍길동의 IP주소는 323.211.123.11 입니다' IP FROM DUAL UNION ALL
      SELECT '앞에 다른 123 숫자가 포함되어 있을 때 IP : 10.10.10.1 입니다..' FROM DUAL UNION ALL
      SELECT '유효하지 않은 IP : 310.10.10.1 입니다..' FROM DUAL UNION ALL
      SELECT '이것도 유효하지 IP : 10.10.10.432 입니다.' FROM DUAL UNION ALL
      SELECT '1.2.3.123 도 추출되어야 하는 IP입니다.' FROM DUAL UNION ALL
      SELECT '범위를 벗어난 IP 100.256.1.1 은 제외되어야 합니다.' FROM DUAL)
SELECT TRIM
           (REGEXP_SUBSTR
                (IP
               , '(^|[^0-9])(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])($|[^0-9])'
               , 1)) IP
  FROM TMP
 WHERE REGEXP_LIKE
           (IP
          , '(^|[^0-9])(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])($|[^0-9])');


한 문장안에 여러개의 IP주소가 포함되어 있을 경우 첫 번째IP주소만 나옴

관련  URL : http://www.gurubee.net/article/67512
2016/06/03 18:45 2016/06/03 18:45