윈도우 함수
윈도우 함수
Druid SQL의 윈도우 함수를 소개해요. 행의 윈도우 내에서 다른 행과의 관계에 기반해 값을 생성하는 함수로, ROW_NUMBER, RANK, LAG, LEAD 등을 다뤄요. 문법과 PARTITION BY·ORDER BY·윈도우 프레임 사용법을 설명해요.
출처: 문서
본문
Apache Druid는 Druid SQL과 native 쿼리 두 가지 쿼리 언어를 지원해요. 이 문서는 SQL 언어를 설명해요.
Apache Druid의 윈도우 함수는 행 윈도우 내의 한 행이 같은 윈도우의 다른 행과 가지는 관계에 기반해 값을 생성해요. 윈도우는 결과 집합 내에서 관련된 행들의 그룹이에요. 예를 들어 특정 dimension에 대해 같은 값을 가진 행들이에요.
Druid의 윈도우 함수는 GROUP BY 문을 필요로 해요. Druid는 윈도우 함수 계산을 수행하기 전에 GROUP BY에 대한 행 수준 집계를 수행해요.
다음 예시는 같은 channel 값을 가진 결과를 윈도우로 구성해요. 각 윈도우에 대해 쿼리는 changed 값에 기반해 각 행의 순위를 오름차순으로 반환해요.
SELECT FLOOR(__time TO DAY) AS event_time, channel, ABS(delta) AS change, RANK() OVER w AS rank_valueFROM wikipediaWHERE channel in ('#kk.wikipedia', '#lt.wikipedia')AND '2016-06-28' > FLOOR(__time TO DAY) > '2016-06-26'GROUP BY channel, ABS(delta), __timeWINDOW w AS (PARTITION BY channel ORDER BY ABS(delta) ASC)
| event_time | channel | change | rank_value | | 2016-06-27T00:00:00.000Z | #kk.wikipedia | 1 | 1 | | 2016-06-27T00:00:00.000Z | #kk.wikipedia | 1 | 1 | | 2016-06-27T00:00:00.000Z | #kk.wikipedia | 7 | 3 | | 2016-06-27T00:00:00.000Z | #kk.wikipedia | 56 | 4 | | 2016-06-27T00:00:00.000Z | #kk.wikipedia | 56 | 4 | | 2016-06-27T00:00:00.000Z | #kk.wikipedia | 63 | 6 | | 2016-06-27T00:00:00.000Z | #kk.wikipedia | 91 | 7 | | 2016-06-27T00:00:00.000Z | #kk.wikipedia | 2440 | 8 | | 2016-06-27T00:00:00.000Z | #kk.wikipedia | 2703 | 9 | | 2016-06-27T00:00:00.000Z | #kk.wikipedia | 6900 | 10 | | 2016-06-27T00:00:00.000Z | #lt.wikipedia | 1 | 1 | | 2016-06-27T00:00:00.000Z | #lt.wikipedia | 2 | 2 | | 2016-06-27T00:00:00.000Z | #lt.wikipedia | 13 | 3 | | 2016-06-27T00:00:00.000Z | #lt.wikipedia | 28 | 4 | | 2016-06-27T00:00:00.000Z | #lt.wikipedia | 53 | 5 | | 2016-06-27T00:00:00.000Z | #lt.wikipedia | 56 | 6 | | 2016-06-27T00:00:00.000Z | #lt.wikipedia | 59 | 7 | | 2016-06-27T00:00:00.000Z | #lt.wikipedia | 391 | 8 | | 2016-06-27T00:00:00.000Z | #lt.wikipedia | 894 | 9 | | 2016-06-27T00:00:00.000Z | #lt.wikipedia | 4358 | 10 |
윈도우 함수는 aggregation function 과 유사해요.
OVER 절 을 사용해 다른 Druid 집계 함수를 윈도우 함수로 취급할 수 있어요. 예를 들어 윈도우 내 행들의 값 합계예요.
윈도우 함수는 별칭(aliasing)을 지원해요.
윈도우 함수 문법
Druid에서 다음 두 문법 중 하나로 윈도우 함수를 작성할 수 있어요. 두 번째 문법은 재사용할 수 있는 윈도우를 참조하기 위한 윈도우 별칭을 보여줘요.
window_function() OVER ( [PARTITION BY partitioning expression] [ORDER BY order expression] [[ROWS, RANGE] BETWEEN range start AND range end])FROM tableGROUP BY dimensions
window_function() OVER wFROM tableWINDOW w AS ([PARTITION BY partitioning expression] [ORDER BY order expression] [[ROWS, RANGE] BETWEEN range start AND range end])GROUP BY dimensions
OVER 절 은 윈도우 함수의 쿼리 윈도우를 다음과 같이 정의해요:
- PARTITION BY 는 윈도우 경계를 정의하는 dimension을 나타내요
- ORDER BY 는 윈도우 내 행의 순서를 지정해요
빈 OVER 절 또는 PARTITION BY 절의 부재는 모든 데이터가 단일 윈도우에 속함을 나타내요.
다음 예시에서 다음 OVER 절 예시는 윈도우 dimension을 channel 로 설정하고 delta 의 절대값 오름차순으로 결과를 정렬해요:
...RANK() OVER (PARTITION BY channel ORDER BY ABS(delta) ASC)...
ROWS 와 RANGE 표현식에 설정된 윈도우 프레임은 윈도우 집계에 사용되는 행 집합을 제한해요.
ROWS 와 RANGE 는 range start 와 range end 에 대해 다음 값을 받아요:
- UNBOUNDED PRECEDING: 순서 표현식에 따라 정렬된 윈도우의 시작부터
- N ROWS PRECEDING: 순서 표현식에 따라 정렬된 현재 행보다 N 행 앞
- CURRENT ROW: 현재 행
- N ROWS FOLLOWING: 순서 표현식에 따라 정렬된 현재 행보다 N 행 뒤
- UNBOUNDED FOLLOWING: 순서 표현식에 따라 정렬된 윈도우의 끝까지
자세한 내용은 Example with window frames 문서를 참고하세요.
Druid는 모든 비-윈도우 집계 함수를 계산하기 전에 GROUP BY dimensions 를 적용해요. 그런 다음 집계된 결과에 대해 윈도우 함수를 적용해요.
때때로 윈도우를 partition이라고 부르기도 해요. 그러나 윈도우 함수의 파티셔닝은 쿼리 시점에 생성된 결과 집합의 셔플(파티션)이며, 데이터를 수집 시점에 파티셔닝하는 Druid의 segment partitioning 기능과 혼동해서는 안 돼요.
ORDER BY 윈도우
윈도우 정의가 PARTITION BY가 아닌 ORDER BY만 지정하면, 집계 데이터 집합을 정렬하고 그 순서로 함수를 적용해요.
다음 쿼리는 ORDER BY SUM(delta) DESC 를 사용해 한 시간 내에 가장 많이 변경된 것부터 가장 적게 변경된 것까지 사용자 시간별 활동을 순위 매겨요:
SELECT TIME_FLOOR(__time, 'PT1H') as time_hour, channel, user, SUM(delta) net_user_changes, RANK() OVER (ORDER BY SUM(delta) DESC) AS editing_rankFROM "wikipedia"WHERE channel IN ('#kk.wikipedia', '#lt.wikipedia') AND __time BETWEEN '2016-06-27' AND '2016-06-28'GROUP BY TIME_FLOOR(__time, 'PT1H'), channel, userORDER BY 5
| time_hour | channel | user | net_user_changes | editing_rank | | 2016-06-27T15:00:00.000Z | #kk.wikipedia | Nurkhan | 6900 | 1 | | 2016-06-27T19:00:00.000Z | #lt.wikipedia | 77.221.66.41 | 4358 | 2 | | 2016-06-27T09:00:00.000Z | #kk.wikipedia | Салиха | 2702 | 3 | | 2016-06-27T04:00:00.000Z | #kk.wikipedia | Nurkhan | 2440 | 4 | | 2016-06-27T09:00:00.000Z | #lt.wikipedia | 80.4.147.222 | 894 | 5 | | 2016-06-27T09:00:00.000Z | #lt.wikipedia | 178.11.203.212 | 447 | 6 | | 2016-06-27T11:00:00.000Z | #kk.wikipedia | Нұрлан Рахымжанов | 126 | 7 | | 2016-06-27T06:00:00.000Z | #kk.wikipedia | Шокай | 91 | 8 | | 2016-06-27T11:00:00.000Z | #lt.wikipedia | MaryroseB54 | 59 | 9 | | 2016-06-27T04:00:00.000Z | #kk.wikipedia | Нұрлан Рахымжанов | 56 | 10 | | 2016-06-27T12:00:00.000Z | #lt.wikipedia | Karoliuk | 53 | 11 | | 2016-06-27T12:00:00.000Z | #lt.wikipedia | Powermelon | 28 | 12 | | 2016-06-27T07:00:00.000Z | #lt.wikipedia | Powermelon | 13 | 13 | | 2016-06-27T10:00:00.000Z | #lt.wikipedia | 80.4.147.222 | 1 | 14 | | 2016-06-27T07:00:00.000Z | #kk.wikipedia | Салиха | -1 | 15 | | 2016-06-27T06:00:00.000Z | #lt.wikipedia | Powermelon | -2 | 16 |
PARTITION BY 윈도우
윈도우가 PARTITION BY partition expression만 지정하면, Druid는 선택된 데이터 집합 내에서 값을 공유하는 모든 행에 대해 집계 윈도우 함수를 계산해요.
다음 예시는 두 개의 다른 윈도우 — PARTITION BY channel 과 PARTITION BY user — 를 사용해 채널의 총 활동과 사용자의 총 활동을 계산해 개별 시간별 활동과 비교할 수 있게 하는 쿼리를 보여줘요:
SELECT TIME_FLOOR(__time, 'PT1H') as time_hour, channel, user, SUM(delta) AS hourly_user_changes, SUM(SUM(delta)) OVER (PARTITION BY user) AS total_user_changes, SUM(SUM(delta)) OVER (PARTITION BY channel) AS total_channel_changesFROM "wikipedia"WHERE channel IN ('#kk.wikipedia', '#lt.wikipedia') AND __time BETWEEN '2016-06-27' AND '2016-06-28'GROUP BY TIME_FLOOR(__time, 'PT1H'), 2, 3ORDER BY channel, TIME_FLOOR(__time, 'PT1H'), user
| time_hour | channel | user | hourly_user_changes | total_user_changes | total_channel_changes | | 2016-06-27T04:00:00.000Z | #kk.wikipedia | Nurkhan | 2440 | 9340 | 12314 | | 2016-06-27T04:00:00.000Z | #kk.wikipedia | Нұрлан Рахымжанов | 56 | 182 | 12314 | | 2016-06-27T06:00:00.000Z | #kk.wikipedia | Шокай | 91 | 91 | 12314 | | 2016-06-27T07:00:00.000Z | #kk.wikipedia | Салиха | -1 | 2701 | 12314 | | 2016-06-27T09:00:00.000Z | #kk.wikipedia | Салиха | 2702 | 2701 | 12314 | | 2016-06-27T11:00:00.000Z | #kk.wikipedia | Нұрлан Рахымжанов | 126 | 182 | 12314 | | 2016-06-27T15:00:00.000Z | #kk.wikipedia | Nurkhan | 6900 | 9340 | 12314 | | 2016-06-27T06:00:00.000Z | #lt.wikipedia | Powermelon | -2 | 39 | 5851 | | 2016-06-27T07:00:00.000Z | #lt.wikipedia | Powermelon | 13 | 39 | 5851 | | 2016-06-27T09:00:00.000Z | #lt.wikipedia | 178.11.203.212 | 447 | 447 | 5851 | | 2016-06-27T09:00:00.000Z | #lt.wikipedia | 80.4.147.222 | 894 | 895 | 5851 | | 2016-06-27T10:00:00.000Z | #lt.wikipedia | 80.4.147.222 | 1 | 895 | 5851 | | 2016-06-27T11:00:00.000Z | #lt.wikipedia | MaryroseB54 | 59 | 59 | 5851 | | 2016-06-27T12:00:00.000Z | #lt.wikipedia | Karoliuk | 53 | 53 | 5851 | | 2016-06-27T12:00:00.000Z | #lt.wikipedia | Powermelon | 28 | 39 | 5851 | | 2016-06-27T19:00:00.000Z | #lt.wikipedia | 77.221.66.41 | 4358 | 4358 | 5851 |
이 예시에서 데이터 집합은 하루로 필터링돼요. 따라서 윈도우 함수 결과는 각각 사용자와 channel dimension에 대한 하루의 총 활동을 나타내요.
이런 유형의 결과는 개별 사용자의 시간별 활동의 영향을 분석하는 데 도움이 돼요:
- hourly_user_changes 를 total_channel_changes 와 비교해 채널에 대한 영향
- total_user_changes 를 total_channel_changes 와 비교해 채널에 대한 각 사용자의 영향
- hourly_user_changes 를 total_user_changes 와 비교해 각 사용자의 개별 활동 진행 상황
윈도우 프레임 가드레일
Druid에는 예기치 않은 결과를 반환할 수 있는 윈도우 프레임 표현식이 있는 윈도우 함수 쿼리를 실행하지 못하게 하는 가드레일 논리가 있어요.
예를 들어:
- 윈도우 프레임의 경계로 표현식을 설정할 수 없어요.
- RANGE 프레임은 두 끝점이 모두 unbounded 또는 current row인 경우에만 사용할 수 있어요.
윈도우 함수 참고
| Function | Notes | | ROW_NUMBER() | 윈도우 내 행의 번호를 1부터 시작해 반환해요 | | RANK() | 윈도우 내 행에 대해 공백이 있는 순위를 반환해요. 예를 들어 두 행이 1위로 동률이면 다음 순위는 3이에요 | | DENSE_RANK() | 공백 없이 윈도우 내 행의 순위를 반환해요. 예를 들어 두 행이 1위로 동률이면 다음 행은 2위로 매겨져요. | | PERCENT_RANK() | RANK() OVER (window) / COUNT(1) OVER (window) 공식에 따라 백분율로 계산된 행의 상대 순위를 반환해요 | | CUME_DIST() | 현재 행과 같거나 더 높은 순위의 윈도우 행 수를 총 윈도우 행 수로 나눈 값으로 계산된, 윈도우 내 현재 행의 누적 분포를 반환해요. 반환 값은 1/행 수 와 1 사이예요 | | NTILE(tiles) | 윈도우 내 행을 버킷이라고도 하는 타일 수로 가능한 한 균등하게 나누고, 행이 속하는 타일의 값을 반환해요 | | LAG(expr[, offset]) | offset 을 제공하지 않으면 현재 행의 바로 앞 행에서 평가된 값을 반환해요. offset 숫자 n 을 지정하면 현재 행보다 n 행 앞에서 평가된 값을 반환해요 | | LEAD(expr[, offset]) | offset 을 제공하지 않으면 현재 행의 바로 뒤 행에서 평가된 값을 반환해요. offset 숫자 n 을 지정하면 현재 행보다 n 행 뒤에서 평가된 값을 반환하고, 그런 행이 없으면 주어진 기본값을 반환해요 | | FIRST_VALUE(expr) | 윈도우 내 첫 번째 행에서 표현식에 대해 평가된 값을 반환해요 | | LAST_VALUE(expr) | 윈도우 내 마지막 행에서 표현식에 대해 평가된 값을 반환해요 |
예시
다음 예시는 Wikipedia 데이터 집합에서 channel의 이벤트당 변경된 문자 수를 비교하기 위해 모든 내장 윈도우 함수를 보여줘요.
SELECT FLOOR(__time TO DAY) AS event_time, channel, ABS(delta) AS change, ROW_NUMBER() OVER w AS row_no, RANK() OVER w AS rank_no, DENSE_RANK() OVER w AS dense_rank_no, PERCENT_RANK() OVER w AS pct_rank, CUME_DIST() OVER w AS cumulative_dist, NTILE(4) OVER w AS ntile_val, LAG(ABS(delta), 1, 0) OVER w AS lag_val, LEAD(ABS(delta), 1, 0) OVER w AS lead_val, FIRST_VALUE(ABS(delta)) OVER w AS first_val, LAST_VALUE(ABS(delta)) OVER w AS last_valFROM wikipediaWHERE channel IN ('#kk.wikipedia', '#lt.wikipedia')GROUP BY channel, ABS(delta), FLOOR(__time TO DAY) WINDOW w AS (PARTITION BY channel ORDER BY ABS(delta) ASC)
| event_time | channel | change | row_no | rank_no | dense_rank_no | pct_rank | cumulative_dist | ntile_val | lag_val | lead_val | first_val | last_val | | 2016-06-27T00:00:00.000Z | #kk.wikipedia | 1 | 1 | 1 | 1 | 0.0 | 0.125 | 1 | null | 7 | 1 | 6900 | | 2016-06-27T00:00:00.000Z | #kk.wikipedia | 7 | 2 | 2 | 2 | 0.14285714285714285 | 0.25 | 1 | 1 | 56 | 1 | 6900 | | 2016-06-27T00:00:00.000Z | #kk.wikipedia | 56 | 3 | 3 | 3 | 0.2857142857142857 | 0.375 | 2 | 7 | 63 | 1 | 6900 | | 2016-06-27T00:00:00.000Z | #kk.wikipedia | 63 | 4 | 4 | 4 | 0.42857142857142855 | 0.5 | 2 | 56 | 91 | 1 | 6900 | | 2016-06-27T00:00:00.000Z | #kk.wikipedia | 91 | 5 | 5 | 5 | 0.5714285714285714 | 0.625 | 3 | 63 | 2440 | 1 | 6900 | | 2016-06-27T00:00:00.000Z | #kk.wikipedia | 2440 | 6 | 6 | 6 | 0.7142857142857143 | 0.75 | 3 | 91 | 2703 | 1 | 6900 | | 2016-06-27T00:00:00.000Z | #kk.wikipedia | 2703 | 7 | 7 | 7 | 0.8571428571428571 | 0.875 | 4 | 2440 | 6900 | 1 | 6900 | | 2016-06-27T00:00:00.000Z | #kk.wikipedia | 6900 | 8 | 8 | 8 | 1 | 1 | 4 | 2703 | null | 1 | 6900 | | 2016-06-27T00:00:00.000Z | #lt.wikipedia | 1 | 1 | 1 | 1 | 0 | 0.1 | 1 | null | 2 | 1 | 4358 | | 2016-06-27T00:00:00.000Z | #lt.wikipedia | 2 | 2 | 2 | 2 | 0.1111111111111111 | 0.2 | 1 | 1 | 13 | 1 | 4358 | | 2016-06-27T00:00:00.000Z | #lt.wikipedia | 13 | 3 | 3 | 3 | 0.2222222222222222 | 0.3 | 1 | 2 | 28 | 1 | 4358 | | 2016-06-27T00:00:00.000Z | #lt.wikipedia | 28 | 4 | 4 | 4 | 0.3333333333333333 | 0.4 | 2 | 13 | 53 | 1 | 4358 | | 2016-06-27T00:00:00.000Z | #lt.wikipedia | 53 | 5 | 5 | 5 | 0.4444444444444444 | 0.5 | 2 | 28 | 56 | 1 | 4358 | | 2016-06-27T00:00:00.000Z | #lt.wikipedia | 56 | 6 | 6 | 6 | 0.5555555555555556 | 0.6 | 2 | 53 | 59 | 1 | 4358 | | 2016-06-27T00:00:00.000Z | #lt.wikipedia | 59 | 7 | 7 | 7 | 0.6666666666666666 | 0.7 | 3 | 56 | 391 | 1 | 4358 | | 2016-06-27T00:00:00.000Z | #lt.wikipedia | 391 | 8 | 8 | 8 | 0.7777777777777778 | 0.8 | 3 | 59 | 894 | 1 | 4358 | | 2016-06-27T00:00:00.000Z | #lt.wikipedia | 894 | 9 | 9 | 9 | 0.8888888888888888 | 0.9 | 4 | 391 | 4358 | 1 | 4358 | | 2016-06-27T00:00:00.000Z | #lt.wikipedia | 4358 | 10 | 10 | 10 | 1 | 1 | 4 | 894 | null | 1 | 4358 |
다음 예시는 윈도우 내 값에 SUM() 함수를 적용해 시간에 따른 채널의 누적 변경을 계산하는 방법을 보여줘요:
SELECT FLOOR(__time TO MINUTE) as "time", channel, ABS(delta) AS changes, sum(ABS(delta)) OVER (PARTITION BY channel ORDER BY FLOOR(__time TO MINUTE) ASC) AS cum_changesFROM wikipediaWHERE channel IN ('#kk.wikipedia', '#lt.wikipedia')GROUP BY channel, __time, delta
| time | channel | changes | cum_changes | | 2016-06-27T04:20:00.000Z | #kk.wikipedia | 56 | 56 | | 2016-06-27T04:35:00.000Z | #kk.wikipedia | 2440 | 2496 | | 2016-06-27T06:15:00.000Z | #kk.wikipedia | 91 | 2587 | | 2016-06-27T07:32:00.000Z | #kk.wikipedia | 1 | 2588 | | 2016-06-27T09:00:00.000Z | #kk.wikipedia | 2703 | 5291 | | 2016-06-27T09:24:00.000Z | #kk.wikipedia | 1 | 5292 | | 2016-06-27T11:00:00.000Z | #kk.wikipedia | 63 | 5355 | | 2016-06-27T11:05:00.000Z | #kk.wikipedia | 7 | 5362 | | 2016-06-27T11:32:00.000Z | #kk.wikipedia | 56 | 5418 | | 2016-06-27T15:21:00.000Z | #kk.wikipedia | 6900 | 12318 | | 2016-06-27T06:17:00.000Z | #lt.wikipedia | 2 | 2 | | 2016-06-27T07:55:00.000Z | #lt.wikipedia | 13 | 15 | | 2016-06-27T09:05:00.000Z | #lt.wikipedia | 894 | 909 | | 2016-06-27T09:12:00.000Z | #lt.wikipedia | 391 | 1300 | | 2016-06-27T09:23:00.000Z | #lt.wikipedia | 56 | 1356 | | 2016-06-27T10:59:00.000Z | #lt.wikipedia | 1 | 1357 | | 2016-06-27T11:49:00.000Z | #lt.wikipedia | 59 | 1416 | | 2016-06-27T12:41:00.000Z | #lt.wikipedia | 53 | 1469 | | 2016-06-27T12:58:00.000Z | #lt.wikipedia | 28 | 1497 | | 2016-06-27T19:03:00.000Z | #lt.wikipedia | 4358 | 5855 |
윈도우 프레임 예시
다음 쿼리는 몇 가지 다른 윈도우 프레임을 사용해 채널별 전체 활동을 계산해요:
SELECT channel, TIME_FLOOR(__time, 'PT1H') AS time_hour, SUM(delta) AS hourly_channel_changes, SUM(SUM(delta)) OVER cumulative AS cumulative_activity_in_channel, SUM(SUM(delta)) OVER moving5 AS csum5, COUNT(1) OVER moving5 AS count5FROM "wikipedia"WHERE channel = '#en.wikipedia' AND __time BETWEEN '2016-06-27' AND '2016-06-28'GROUP BY 1, TIME_FLOOR(__time, 'PT1H')WINDOW cumulative AS ( PARTITION BY channel ORDER BY TIME_FLOOR(__time, 'PT1H') ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) , moving5 AS ( PARTITION BY channel ORDER BY TIME_FLOOR(__time, 'PT1H') ROWS BETWEEN 4 PRECEDING AND CURRENT ROW )
| channel | time_hour | hourly_channel_changes | cumulative_activity_in_channel | csum5 | count5 | | #en.wikipedia | 2016-06-27T00:00:00.000Z | 74996 | 74996 | 74996 | 1 | | #en.wikipedia | 2016-06-27T01:00:00.000Z | 24150 | 99146 | 99146 | 2 | | #en.wikipedia | 2016-06-27T02:00:00.000Z | 102372 | 201518 | 201518 | 3 | | #en.wikipedia | 2016-06-27T03:00:00.000Z | 61362 | 262880 | 262880 | 4 | | #en.wikipedia | 2016-06-27T04:00:00.000Z | 61666 | 324546 | 324546 | 5 | | #en.wikipedia | 2016-06-27T05:00:00.000Z | 144199 | 468745 | 393749 | 5 | | #en.wikipedia | 2016-06-27T06:00:00.000Z | 33414 | 502159 | 403013 | 5 | | #en.wikipedia | 2016-06-27T07:00:00.000Z | 79397 | 581556 | 380038 | 5 | | #en.wikipedia | 2016-06-27T08:00:00.000Z | 104436 | 685992 | 423112 | 5 | | #en.wikipedia | 2016-06-27T09:00:00.000Z | 58020 | 744012 | 419466 | 5 | | #en.wikipedia | 2016-06-27T10:00:00.000Z | 93904 | 837916 | 369171 | 5 | | #en.wikipedia | 2016-06-27T11:00:00.000Z | 74436 | 912352 | 410193 | 5 | | #en.wikipedia | 2016-06-27T12:00:00.000Z | 83491 | 995843 | 414287 | 5 | | #en.wikipedia | 2016-06-27T13:00:00.000Z | 103051 | 1098894 | 412902 | 5 | | #en.wikipedia | 2016-06-27T14:00:00.000Z | 211411 | 1310305 | 566293 | 5 | | #en.wikipedia | 2016-06-27T15:00:00.000Z | 101247 | 1411552 | 573636 | 5 | | #en.wikipedia | 2016-06-27T16:00:00.000Z | 189765 | 1601317 | 688965 | 5 | | #en.wikipedia | 2016-06-27T17:00:00.000Z | 74404 | 1675721 | 679878 | 5 | | #en.wikipedia | 2016-06-27T18:00:00.000Z | 104824 | 1780545 | 681651 | 5 | | #en.wikipedia | 2016-06-27T19:00:00.000Z | 71268 | 1851813 | 541508 | 5 | | #en.wikipedia | 2016-06-27T20:00:00.000Z | 88185 | 1939998 | 528446 | 5 | | #en.wikipedia | 2016-06-27T21:00:00.000Z | 42584 | 1982582 | 381265 | 5 |
이 예시는 다양한 윈도우 함수 계산에 사용할 수 있는 여러 윈도우 사양을 WINDOW 절 에서 정의해요.
이 쿼리는 두 개의 윈도우를 사용해요:
- cumulative 는 channel 로 파티셔닝되고 __time 으로 정렬된 파티션의 시작부터 현재 행까지의 모든 행을 포함해 누적 집계를 가능하게 해요
- moving5 도 channel 로 파티셔닝되지만 시간으로 정렬된 마지막 네 행과 현재 행까지만 포함해요
count5 컬럼의 moving5 윈도우에 대해 고려되는 행 수:
- 현재 행 앞에 행이 없으므로 단일 행에서 시작해요
- ROWS BETWEEN 4 ROWS PRECEDING AND CURRENT ROW 로 정의된 대로 최대 5행까지 늘어나요
알려진 문제
다음은 윈도우 함수의 알려진 문제예요:
- WHERE 절이 없는 SELECT * 쿼리는 지원되지 않아요. 이 경우 모든 컬럼을 검색하려면 컬럼 이름을 지정하세요.
더 알아보기 (Learn more)
- Druid SQL 개요 — SQL 기능 전반
- 집계 함수 — 집계 함수
- SQL 스칼라 함수 — 기타 함수