MYSQL8. window function 정리

j_6367·2022년 7월 1일
0

mysql8

목록 보기
8/8

쿼리

SELECT id                         AS id     
     , parent_id                  AS parent_id     
     , value                      AS value
     
     # 1부터 순서대로 - 공동순위 없음
     , row_number() OVER w        AS rownumber

     # 순위 %
     , PERCENT_RANK() OVER w      AS 'percent_rank'

     # 순위 - 공동1위 있으면 다음순위 3등
     , RANK() OVER w              AS 'RANK'

     # 순위 - 공동1위 있어도 다음순위 2등
     , DENSE_RANK() OVER w        AS 'DENSE_RANK'

     # 첫 번째 값
     , FIRST_VALUE(value) OVER w  AS 'FIRST_VALUE'

     # 마지막 값
     , LAST_VALUE(value) OVER w   AS 'LAST_VALUE'

     # 이전 값
     , LAG(value) OVER w          AS 'LAG'

     # 이후 값
     , LEAD(value) OVER w         AS 'LEAD'

     # 파티션 내 3번째 'value'값
     , NTH_VALUE(value, 3) OVER w AS 'NTH_VALUE'

     # 파티션을 N개로 나눈 후 현재 분할된 파티션의 번호
     , NTILE(3) OVER w            AS 'NTILE'
FROM (
         VALUES
             /* parent_id = 1 */
             ROW(1, 1, 100)
            ,ROW(2, 1, 100)
            ,ROW(3, 1, 300)
            ,ROW(4, 1, 400)
            ,ROW(5, 1, 500)
            ,ROW(6, 1, 600)
            /* parent_id = 2 */
            ,ROW(7, 2, 900)
            ,ROW(8, 2, 100)
            ,ROW(9, 2, 500)
            ,ROW(10, 2, 700)
            ,ROW(11, 2, 600)
            ,ROW(12, 2, 300)
            ,ROW(13, 2, 300)
            ,ROW(14, 2, 300)
            ,ROW(15, 2, 300)
            ,ROW(16, 2, 300)
            ,ROW(17, 2, 300)
            ,ROW(18, 2, 300)
         ) AS t(id, parent_id, value)
    WINDOW w AS (
    	PARTITION BY parent_id 
        ORDER BY value
        # 기본값 - 첫 번째 행부터 현재 행까지
#         RANGE BETWEEN UNBOUNDED PRECEDING
#             AND CURRENT ROW

        # 1행 이후부터 2행 이후까지
#         RANGE BETWEEN 1 FOLLOWING
#                   AND 2 FOLLOWING

        # 첫 번째 행부터 마지막 행까지
#         RANGE BETWEEN UNBOUNDED PRECEDING
#                   AND UNBOUNDED FOLLOWING

        # 1행 전부터 1행 이후까지
#         RANGE BETWEEN 1 PRECEDING
#                   AND 1 FOLLOWING
    )
ORDER BY id

order by가 있을 경우

처음 행부터 현재 행까지 집계

order by가 없을 경우

처음 행부터 마지막 행까지 집계

결과

idparent_idvaluerownumberpercent_rankRANKDENSE_RANKFIRST_VALUELAST_VALUELAGLEADNTH_VALUENTILE
1110010111001001001
2110020111001001003001
3130030.4321003001004003002
4140040.6431004003005003002
5150050.8541005004006003003
6160061651006005003003
7290061661009007005003
8210010111001003001
9250030.4331005003006005002
10270050.8551007006009005003
11260040.6441006005007005002
12230020.2221003001005001

참조
https://dev.mysql.com/doc/refman/8.0/en/window-functions.html

0개의 댓글