Window 함수의 LAST_VALUE 함정에 빠졌습니다.

Window 함수 편리하네요.
너무 편리해서 굉장히 사용하고 있으면 최근 있는 것에 빠졌기 때문에 기록해 둡니다.

부딪힌 문제


LAST_VALUE를 사용하여 사용자 당 마지막 작업을 알고 싶습니다.
그래서 이런 쿼리를 냈지만 왜 LAST_VALUE
SELECT
    user_id
    ,td_url
    ,time
    ,LAST_VALUE(td_url) OVER (
        PARTITION BY user_id
        ORDER BY time
    ) AS last_url
FROM pageviews 

예상
user_id | time   | td_url   | last_url
------- | ------ | -------- | --------
AAA     | 00:01  | url_1    | url_3
AAA     | 00:02  | url_2    | url_3
AAA     | 00:03  | url_3    | url_3
BBB     | 00:01  | url_1    | url_1

결과
user_id | time   | td_url   | last_url
------- | ------ | -------- | --------
AAA     | 00:01  | url_1    | url_1
AAA     | 00:02  | url_2    | url_2
AAA     | 00:03  | url_3    | url_3
BBB     | 00:01  | url_1    | url_1

···? !
여러가지 시행착오했을 때,
  • FIEST_VALUE 를 확인하지만 잘 작동합니다. 왜 FIRST 갈아서 LAST
  • 똑같이 MAX 도 값이 의도하지 않은 것이 되었지만 MIN 는 옳다. 「마지막」을 취하는 계가 안돼?
  • RANK 이나 LEG 등도 문제 없다. PARTITION 설정 등은 이상하지 않을 것입니다

  • 해결책


  • RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 를 붙인다
  • SELECT
        user_id
        ,LAST_VALUE(td_url) OVER (
            PARTITION BY user_id
            ORDER BY time
            ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
        ) AS last_url
    FROM pageviews 
    

    대답은 공식 참조 : 세 번째 검은 주머니에있었습니다.
  • OVER 내의 쿼리에는, 디폴트로 RANGE UNBOUNDED PRECEDING 가 붙는다 (명시하지 않으면 이것이 된다)
  • 이것은 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW 와 동의로, PARTITION 로 단락한 가운데 「1번째」로부터 「자신」까지 밖에 조사하지요, 라고 하는 의미
  • FIRST_VALUE 가 성공한 것은 FIRST
  • 그래서 TreasureData의 사람도 되도록 FIRST_VALUE
  • 참조 : TreasureData 기사

  • 실제로 CURRENT ROW 로 하면 올바르지 않은 값으로 돌아왔다
  • 하지만 실제로 사용할 때 이것을 붙이는 것이 길고 잊을 것 같아서 DESC
    SELECT
        user_id
        ,td_url
        ,time
        ,FIRST_VALUE(td_url) OVER (
            PARTITION BY user_id
            ORDER BY time DESC
        ) AS last_url
    FROM pageviews 
    

    결과
    user_id | time   | td_url   | last_url
    ------- | ------ | -------- | --------
    AAA     | 00:01  | url_1    | url_3
    AAA     | 00:02  | url_2    | url_3
    AAA     | 00:03  | url_3    | url_3
    BBB     | 00:01  | url_1    | url_1
    

    요시 요시

    결론



    문서를 잘 읽자.
  • 좋은 웹페이지 즐겨찾기