창 기능, 시각화 - 순위

6103 단어 postgressql
이전 게시물에서는 Window Function Calls의 작동 방식에 대해 이야기했습니다. 오늘은 row_number , rank , dense_rankpercent_rank 로 시작하여 사용 가능한 다양한 창 함수에 대해 자세히 살펴보겠습니다.

다음과 같은 항목이 있는 이전 게시물의 동일한 비용 테이블을 사용합니다.


설명
비용


버스를 타고


점심
15

...



다음 예에서 창 프레임은 가장 높은 비용에서 가장 낮은 비용으로 정렬된 전체 비용 테이블이 됩니다.

SELECT
  [ window function ] OVER(ORDER BY cost DESC),
  expenses.description,
  expenses.cost
FROM expenses




행_번호


row_number부터 시작하겠습니다.

... ROW_NUMBER() OVER(ORDER BY cost DESC), ...


모든row_number 기능은 1부터 시작하여 프레임의 각 행에 실행 숫자를 추가하는 것입니다.


행_번호
설명
비용


1
식료 잡화류
60

2
저녁
35


택시
20

4
점심
15

5
점심
15

6
저녁
15

7
차 휴식
5

8
버스를 타고
4

9
버스를 타고


10
버스를 타고



dense_rank


dense_rank가 더 흥미롭습니다. 이전 예를 검토하면 비용이 동일한 항목이 몇 개 있음을 알 수 있습니다. Postgres 설명서에서는 이를 피어 그룹이라고 하며 dense_rank 행 대신 그룹별로 계산되는 실행 숫자를 추가합니다.



따라서 SQL을 다음과 같이 변경합니다.

... DENSE_RANK() OVER(ORDER BY cost DESC), ...


우리에게 이것을 제공합니다:


dense_rank
설명
비용


1
식료 잡화류
60

2
저녁
35


택시
20

4
점심
15

4
점심
15

4
저녁
15

5
차 휴식
5

6
버스를 타고
4

7
버스를 타고


7
버스를 타고



참고: 실제로 Postgres가 피어 그룹 내에서 행을 정렬하는 방법을 잘 모르겠습니다. 작은 예에서는 암시적ORDER BY ID DESC이 추가된 것처럼 보이지만 Postgresdocs는 정렬이 아닌 경우 일반 정렬에 대해서도 말합니다. 선택하면 행이 지정되지 않은 순서로 반환됩니다 🤷‍♂️.

계급


rankdense_rank와 한 가지 큰 차이점이 있습니다. 즉, 이전 피어 그룹의 "갭"을 계산합니다.



차이점을 보여주기 위해 각 함수의 결과를 비교해 보겠습니다.


dense_rank
계급
설명
비용


1
1
...
...

2
2
...
...



...
...

4
4
...
...

4
4
...
...

4
4
...
...

5
7
...
...

6
8
...
...

7
9
...
...

7
9
...
...


퍼센트_랭크



이것은 흥미로운 것입니다. 그것이 파생되는 방법은 약간 복잡하므로 쿼리로 시작하여 예를 들어 보여드리겠습니다.

... PERCENT_RANK() OVER(ORDER BY cost DESC), ...


결과:


퍼센트_랭크
설명
비용


0
식료 잡화류
60

0.11...
저녁
35

0.22...
택시
20

0.33...
점심
15

0.33...
점심
15

0.33...
저녁
15

0.66...
차 휴식
5

0.77...
버스를 타고
4

0.88...
버스를 타고


0.88...
버스를 타고



연속 숫자 대신 0에서 1까지의 "상대 순위"를 얻습니다. 이것은 어떤 항목이 가장 높은 순위에 얼마나 가까운지 알아야 하는 경우에 유용합니다. 하지만 위의 예에서 볼 수 있듯이 가장 높은 순위에 대한 동률이 있는 경우 1로 끝나지 않을 수 있습니다(자세한 설명here ).

나란히



마지막으로 결과를 나란히 살펴보겠습니다.


행_번호
dense_rank
계급
퍼센트_랭크
설명
비용


1
1
1
0
식료 잡화류
60

2
2
2
0.11...
저녁
35




0.22...
택시
20

4
4
4
0.33...
점심
15

5
4
4
0.33...
점심
15

6
4
4
0.33...
저녁
15

7
5
7
0.66...
차 휴식
5

8
6
8
0.77...
버스를 타고
4

9
7
9
0.88...
버스를 타고


10
7
9
0.88...
버스를 타고



도움이 되었기를 바랍니다. 다음은 가지고 놀 수 있는 sqlfiddle입니다.

향후 기사에서는 더 많은 창 기능을 살펴보겠습니다. 팔로우 하시면 다음 소식을 알 수 있습니다!

좋은 웹페이지 즐겨찾기