Window 함수의 LAST_VALUE 함정에 빠졌습니다.
4855 단어 Window 함수TreasureDataPresto
너무 편리해서 굉장히 사용하고 있으면 최근 있는 것에 빠졌기 때문에 기록해 둡니다.
부딪힌 문제
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
FIRST_VALUE
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
요시 요시
결론
문서를 잘 읽자.
Reference
이 문제에 관하여(Window 함수의 LAST_VALUE 함정에 빠졌습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/namachapanda20/items/1b3ee91759f040738ac1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)