Hive - 분석 함수
7908 단어 기술 층 - hiv
분석 함수 가 뭐 예요?
분석 함 수 는 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;