수색…


일반적인 예

데이터 준비 :

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_ranki의 을 창 모양으로 정렬 합니다. i=1 나타나므로 첫 번째 행은 dense_rank를 가지며 다음과 세 번째 값은 변경되지 않으므로 dense_rank1을 표시합니다. - FIRST 값은 변경되지 않습니다. 네 번째 줄은 i=2 이고, 두 번째 값은 내가 만났기 때문에 dense_rank 는 2를 나타내며 그 다음 줄을 나타냅니다. 그럼 충족 값 i=3 6 행에서, 나머지 3 개의 값이 표시되도록 동일. 따라서 dense_rank 의 마지막 값은 i 의 고유 값의 수입니다.

  • row_number 는 나열된 정렬 합니다.

  • rank dense_rank 와 혼동하지 dense_rank 함수는 i 값의 ROW NUMBERdense_rank 합니다. 그래서 그것은 3과 동일하게 시작하지만 다음 값 4를 갖습니다. 이는 행 4에서 i=2 (새로운 값)가 충족되었음을 의미합니다. 6 행에서 같은 i=3 이 충족되었습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow