Hive - 분석 함수

7908 단어 기술 층 - hiv
원본:http://www.cnblogs.com/linjiqin/archive/2012/04/06/2434806.html
분석 함수 가 뭐 예요?
분석 함 수 는 Oracle 이 복잡 한 보고서 통계 수 요 를 해결 하 는 데 사용 되 는 기능 이 강 한 함수 로 데이터 에서 그룹 을 나 눈 다음 에 그룹 을 바탕 으로 하 는 특정한 통계 치 를 계산 할 수 있 고 각 그룹의 모든 줄 은 하나의 통계 치 를 되 돌려 줄 수 있다.
분석 함수 와 집합 함수 의 차이 점 은 무엇 입 니까?
일반적인 집합 함 수 는 group by 로 그룹 을 나 누고 각 그룹 은 하나의 통계 값 을 되 돌려 줍 니 다. 분석 함 수 는 partition by 로 그룹 을 나 누고 각 그룹 은 하나의 통계 값 을 되 돌려 줍 니 다.
분석 함수 의 형식
분석 함 수 는 창 을 여 는 함수 over () 를 가지 고 있 습 니 다. 세 개의 분석 자 구 를 포함 합 니 다. 그룹 (partition by), 정렬 (orderby), 창 (rows), 그들의 사용 형식 은 다음 과 같 습 니 다. over (partition by xxx order by yy rows between zzz).
-----first_value () 와 lastvalue (): 최대 값 에 대응 하 는 기타 속성 구하 기
FIRST_VALUE(AREA_CODE)  OVER(PARTITION BY BILL_MONTH ORDER BY SUM(LOCAL_FARE) DESC  ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FIRSTVAL, 
LAST_VALUE(AREA_CODE)  OVER(PARTITION BY BILL_MONTH ORDER BY SUM(LOCAL_FARE) DESC  ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) LASTVAL 
-----rank(),dense_rank () 와 rownumber (): 정렬
rank () 값 은 동시 순위 가 같 고, 그 후 순위 점프 는 연속 되 지 않 는 다.
RANK() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC) RW
dense_rank () 값 은 동시 순위 가 같 고, 그 후 순 위 는 연속 점프 하지 않 는 다.
DENSE_RANK() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC) RW
row_number () 값 은 동시 순위 가 같 지 않 고, 그 후 순위 가 연속 점프 하지 않 는 다.
ROW_NUMBER() OVER(PARTITION BY DEPTNO ORDER BY SAL DESC) RW
- - - lag () 와 lead (): 이전 또는 그 후의 N 행 을 구하 십시오. 
lag 와 lead 함 수 는 한 번 의 조회 에서 같은 필드 의 앞 n 줄 의 데이터 와 뒤 n 줄 의 값 을 추출 할 수 있 습 니 다.이 조작 은 같은 표 의 표 연결 을 사용 하여 이 루어 질 수 있 으 나 lag 와 lead 를 사용 하 는 것 이 더욱 효율 적 입 니 다.lag (arg 1, arg 2, arg 3) 의 첫 번 째 매개 변 수 는 열 이름 이 고 두 번 째 매개 변 수 는 오프셋 오프셋 입 니 다. 세 번 째 매개 변 수 는 기록 창 을 초과 할 때의 기본 값 입 니 다.
예 를 들 면 다음 과 같다: SQL > select * from kkk;                                                                                                                      ID NAME                                                    ---------- --------------------                                             1 1name                                                            2 2name                                                            3 3name                                                            4 4name                                                            5 5name                                                   SQL> select id,name,lag(name,1,0) over(order by id) from kkk;                                                                             ID NAME                 LAG(NAME,1,0)OVER(ORDERBYID)       ---------- -------------------- ----------------------------                1 1name                0                                           2 2name                1name                                       3 3name                2name                                       4 4name                3name                                       5 5name                4name SQL> select id,name,lead(name,1,0) over(order by id) from kkk;                                                                            ID NAME                 LEAD(NAME,1,0)OVER(ORDERBYID)      ---------- -------------------- -----------------------------               1 1name                2name                                       2 2name                3name                                       3 3name                4name                                       4 4name                5name                                       5 5name                0 SQL> select id,name,lead(name,2,0) over(order by id) from kkk;                                                                                                                        ID NAME                 LEAD(NAME,2,0)OVER(ORDERBYID)      ---------- -------------------- -----------------------------               1 1name                3name                                       2 2name                4name                                       3 3name                5name                                       4 4name                0                                           5 5name                0   SQL> select id,name,lead(name,1,'linjiqin') over(order by id) from kkk;                                                                                                                              ID NAME                 LEAD(NAME,1,'ALSDFJLASDJFSAF')                     ---------- -------------------- ------------------------------                              1 1name                2name                                                       2 2name                3name                                                       3 3name                4name                                                       4 4name                5name                                                       5 5name                linjiqin  
--- --- - rollup () 과 cube (): 배열 조합 그룹 
1), group by rollup (a, b, c): 먼저 (a, b, c) group by 를 한 다음 에 (a, b) group by 를 한 다음 에 (a) group by 를 한 다음 에 (a) group by 를 한 다음 에 전체 표를 종합 적 으로 조작 합 니 다.2), group by cube (a, b, c): 먼저 (a, b, c) 에 대해 group by 를 하고 그 다음 에 (a, b), (a, c), (a), (b, c), (b), (c) 순 으로 전체 표를 모 으 는 작업 을 한다.
--- --- max (), min (), sum () 과 avg (): 이동 의 최 값 총화 와 평균 값 구하 기
SUM(LOCAL_FARE) OVER(PARTITION BY AREA_CODE  ORDER BY TO_NUMBER(BILL_MONTH)  RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING)  AVG(LOCAL_FARE) OVER(PARTITION BY AREA_CODE ORDER BY TO_NUMBER(BILL_MONTH)  RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING)  MAX(LOCAL_FARE) OVER(PARTITION BY AREA_CODE  ORDER BY TO_NUMBER(BILL_MONTH)   RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING)  MIN(LOCAL_FARE) OVER(PARTITION BY AREA_CODE ORDER BY TO_NUMBER(BILL_MONTH)  RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING) 
- unbounded preceding and unbounded following 현재 모든 기록 의 앞, 뒤 기록, 즉 표 의 모든 기록
-- unbounded: 통제 되 지 않 는, 무한 한
-- preceding: 그 전에
-- following: 다음
----ROWS BETWEEN unbounded preceding AND current row  첫 줄 에서 현재 줄 까지 의 집계
- ROWS BETWEEN current row AND unbounded following
--- - ROWS BETWEEN 1 preceding AND current row 는 현재 줄 의 이전 줄 (rownum - 1) 을 현재 줄 로 모 으 는 것 을 말한다.
--- - ROWS BETWEEN 1 preceding AND 1 following 은 현재 줄 의 이전 줄 (rownum - 1) 에서 현재 줄 의 다음 줄 (rownum + 2) 까지 의 집계
누차
SELECT AREA_CODE, 
       BILL_MONTH,
       LOCAL_FARE,
       SUM(LOCAL_FARE) OVER(PARTITION BY AREA_CODE 
                            ORDER BY BILL_MONTH ASC) "last_sum_value" 
  FROM (SELECT T.AREA_CODE, T.BILL_MONTH, SUM(T.LOCAL_FARE) LOCAL_FARE 
          FROM T 
         GROUP BY T.AREA_CODE, T.BILL_MONTH) 
 ORDER BY AREA_CODE, BILL_MONTH

정렬
ROW_NUMBER() over (PARTITION byhexuncookieid order by cycookied) order
줄 번 호 를 정렬 할 필요 가 없다.
select row_number() over () as rowid, cust_idfrom dms.fund_trans_log2 limit 10;

좋은 웹페이지 즐겨찾기