postgresql
창 함수
수색…
일반적인 예
데이터 준비 :
create table wf_example(i int, t text,ts timestamptz,b boolean);
insert into wf_example select 1,'a','1970.01.01',true;
insert into wf_example select 1,'a','1970.01.01',false;
insert into wf_example select 1,'b','1970.01.01',false;
insert into wf_example select 2,'b','1970.01.01',false;
insert into wf_example select 3,'b','1970.01.01',false;
insert into wf_example select 4,'b','1970.02.01',false;
insert into wf_example select 5,'b','1970.03.01',false;
insert into wf_example select 2,'c','1970.03.01',true;
달리는:
select *
, dense_rank() over (order by i) dist_by_i
, lag(t) over () prev_t
, nth_value(i, 6) over () nth
, count(true) over (partition by i) num_by_i
, count(true) over () num_all
, ntile(3) over() ntile
from wf_example
;
결과:
i | t | ts | b | dist_by_i | prev_t | nth | num_by_i | num_all | ntile
---+---+------------------------+---+-----------+--------+-----+----------+---------+-------
1 | a | 1970-01-01 00:00:00+01 | f | 1 | | 3 | 3 | 8 | 1
1 | a | 1970-01-01 00:00:00+01 | t | 1 | a | 3 | 3 | 8 | 1
1 | b | 1970-01-01 00:00:00+01 | f | 1 | a | 3 | 3 | 8 | 1
2 | c | 1970-03-01 00:00:00+01 | t | 2 | b | 3 | 2 | 8 | 2
2 | b | 1970-01-01 00:00:00+01 | f | 2 | c | 3 | 2 | 8 | 2
3 | b | 1970-01-01 00:00:00+01 | f | 3 | b | 3 | 1 | 8 | 2
4 | b | 1970-02-01 00:00:00+01 | f | 4 | b | 3 | 1 | 8 | 3
5 | b | 1970-03-01 00:00:00+01 | f | 5 | b | 3 | 1 | 8 | 3
(8 rows)
설명:
dist_by_i : dense_rank() over (order by i)
는 고유 값마다 row_number와 같습니다. i ( count(DISTINCT i)
가 작동하지 않음 count(DISTINCT i)
의 고유 한 값의 수에 사용할 수 있습니다. 그냥 최대 값을 사용하십시오.
prev_t : lag(t) over ()
는 전체 창에서 t의 이전 값입니다. 첫 번째 행에 대해서는 null이라는 것을 기억하십시오.
제 n : nth_value(i, 6) over ()
전체 창 위에 여섯 번째 행의 열 I의 값
num_by_i : count(true) over (partition by i)
은 count(true) over (partition by i)
각 값에 대한 행의 양입니다
num_all : count(true) over ()
는 전체 윈도우에 걸친 행의 양입니다
ntile : ntile(3) over()
는 전체 창을 수량 부분에서 3 (가능한 한 많이 ntile(3) over()
분할합니다.
열 값 대 dense_rank 대 순위 vs 행 번호
여기 에서 기능을 찾을 수 있습니다.
앞의 예제에서 만든 wf_example 테이블을 사용하여 다음을 실행합니다.
select i
, dense_rank() over (order by i)
, row_number() over ()
, rank() over (order by i)
from wf_example
결과는 다음과 같습니다.
i | dense_rank | row_number | rank
---+------------+------------+------
1 | 1 | 1 | 1
1 | 1 | 2 | 1
1 | 1 | 3 | 1
2 | 2 | 4 | 4
2 | 2 | 5 | 4
3 | 3 | 6 | 6
4 | 4 | 7 | 7
5 | 5 | 8 | 8
dense_rank 는 i의 값 을 창 모양으로 정렬 합니다.
i=1
나타나므로 첫 번째 행은 dense_rank를 가지며 다음과 세 번째 값은 변경되지 않으므로dense_rank
는 1을 표시합니다. - FIRST 값은 변경되지 않습니다. 네 번째 줄은i=2
이고, 두 번째 값은 내가 만났기 때문에dense_rank
는 2를 나타내며 그 다음 줄을 나타냅니다. 그럼 충족 값i=3
6 행에서, 난 나머지 3 개의 값이 표시되도록 동일. 따라서dense_rank
의 마지막 값은 i 의 고유 값의 수입니다.row_number 는 나열된 행 을 정렬 합니다.
rank
dense_rank
와 혼동하지dense_rank
함수는 i 값의 ROW NUMBER 를dense_rank
합니다. 그래서 그것은 3과 동일하게 시작하지만 다음 값 4를 갖습니다. 이는 행 4에서i=2
(새로운 값)가 충족되었음을 의미합니다. 6 행에서 같은i=3
이 충족되었습니다.