창 함수 목록

23126 단어 sql
PostgreSQL에는 현재 조회 줄과 관련된 줄에 걸쳐 계산을 수행할 수 있는 내장된 창 함수가 있습니다.지난 글에서 나는 창 함수가 어떻게 작동하는지의 기본 개념을 논술했다.본문에서, 나는 그 중의 일부 창 함수에 대해 개술할 것이다.윈도우즈 함수는 네 가지로 나뉘는데 그것이 바로 집합 함수, 랭킹 함수, 분포 함수와 분석 함수이다.
내장된 창 기능은 다음과 같습니다.

집합 열의 함수를 제외한 모든 함수는 OVER 자문을 사용해야 작동할 수 있습니다.

집합 창 함수


창 함수의 한 용례는 이동 평균치와 이동 총수를 계산하는 것이다.우리는 집합 함수를 사용하여 이 점을 실현할 수 있다.함수 뒤에 OVER 자구가 있을 때만 집합 함수가 창 함수로 충당된다는 것을 기억하십시오.OVER 자문을 생략하면 일반 집합과 유사하게 작동하며 전체 집합에 한 줄을 되돌려줍니다.내장된 모든 일반 집합 함수를 창 함수로 사용할 수 있습니다.그러나 본문에서 나는 그 중 다섯 개만 사용했다.
기능
그것의 작용
평균(args)
창 프레임 안의 모든 비공식 입력 값의 평균 (산술 평균).
개수
창 프레임 안의 비어 있지 않은 값의 계수입니다.
최대(args)
창 프레임 안의 비어 있지 않은 값의 최대 값입니다.
최소(args)
창 프레임 안의 비어 있지 않은 값의 최소 값입니다.
합계
창 프레임 안의 비어 있지 않은 값의 합계입니다.
집계 함수는 ORDER BY가 필요하지 않지만 창 프레임 정의(행, 범위 및 그룹)를 따릅니다.
다음 검색은 실행 중인 집합 함수를 보여 줍니다.
SELECT customer_id AS cid,
       billing_city AS city, 
       total, 
       ROUND(AVG(total) OVER(PARTITION BY billing_city), 2) AS avg,
       COUNT(total) OVER(PARTITION BY billing_city) AS count,
       MAX(total) OVER(PARTITION BY billing_city) AS max,
       MIN(total) OVER(PARTITION BY billing_city) AS min,
       SUM(total) OVER(PARTITION BY billing_city) AS sum
FROM invoice;
 cid |   city    | total | avg  | count |  max  | min  |  sum
-----+-----------+-------+------+-------+-------+------+-------
  48 | Amsterdam |  1.98 | 5.80 |     7 | 13.86 | 0.99 | 40.62
  48 | Amsterdam | 13.86 | 5.80 |     7 | 13.86 | 0.99 | 40.62
  48 | Amsterdam |  0.99 | 5.80 |     7 | 13.86 | 0.99 | 40.62
  48 | Amsterdam |  8.91 | 5.80 |     7 | 13.86 | 0.99 | 40.62
  48 | Amsterdam |  8.94 | 5.80 |     7 | 13.86 | 0.99 | 40.62
  48 | Amsterdam |  3.96 | 5.80 |     7 | 13.86 | 0.99 | 40.62
  48 | Amsterdam |  1.98 | 5.80 |     7 | 13.86 | 0.99 | 40.62
  59 | Bangalore |  1.99 | 6.11 |     6 | 13.86 | 1.98 | 36.64
  59 | Bangalore |  8.91 | 6.11 |     6 | 13.86 | 1.98 | 36.64
  59 | Bangalore |  1.98 | 6.11 |     6 | 13.86 | 1.98 | 36.64
  59 | Bangalore | 13.86 | 6.11 |     6 | 13.86 | 1.98 | 36.64
  59 | Bangalore |  3.96 | 6.11 |     6 | 13.86 | 1.98 | 36.64
  59 | Bangalore |  5.94 | 6.11 |     6 | 13.86 | 1.98 | 36.64
 <------------------------ TRUNCATED ------------------------->

랭킹 함수


창 함수를 사용하는 또 다른 용례는 줄에 번호를 분배하는 것이다. PostgreSQL은 이 문제를 처리하는 세 가지 함수를 제공했다.
기능
그것의 작용
행 번호()
창 구역에 있는 현재 줄의 번호를 되돌려줍니다.이 숫자들은 유일무이하다.
질()
구역에서 현재 줄의 랭킹을 되돌려줍니다.격차와 묶인 가치관이 있을 것이다.
조밀순 ()
현재 줄의 구역 내 랭킹을 되돌려줍니다. 간격은 없지만 귀속값이 있습니다.이를 또래 집단에 미치는 중요한 영향으로 볼 수 있다.

ROW NUMBER()는 ORDER BY가 필요하지 않지만 RANK()와 density RANK()는 ORDER BY가 필요합니다.이 함수들은 창 프레임 정의를 받아들이지 않습니다.
아래의 조회는 행수(), 질(), 밀질()의 역할을 나타낸다.
SELECT customer_id AS cid,
       billing_city AS city, 
       total, 
       ROW_NUMBER() OVER(PARTITION BY billing_city) AS row_number,
       RANK() OVER(PARTITION BY billing_city ORDER BY total) AS rank,
       DENSE_RANK() OVER(PARTITION BY billing_city ORDER BY total) AS dense_rank
FROM invoice;
 cid | city         | total | row_number | rank | dense_rank
-----+--------------+-------+------------+------+------------
  48 | Amsterdam    |  0.99 |          1 |    1 |          1
  48 | Amsterdam    |  1.98 |          2 |    2 |          2
  48 | Amsterdam    |  1.98 |          3 |    2 |          2
  48 | Amsterdam    |  3.96 |          4 |    4 |          3
  48 | Amsterdam    |  8.91 |          5 |    5 |          4
  48 | Amsterdam    |  8.94 |          6 |    6 |          5
  48 | Amsterdam    | 13.86 |          7 |    7 |          6
  59 | Bangalore    |  1.98 |          1 |    1 |          1
  59 | Bangalore    |  1.99 |          2 |    2 |          2
  59 | Bangalore    |  3.96 |          3 |    3 |          3
  59 | Bangalore    |  5.94 |          4 |    4 |          4
  59 | Bangalore    |  8.91 |          5 |    5 |          5
  59 | Bangalore    | 13.86 |          6 |    6 |          6
 <------------------------ TRUNCATED -------------------------> 

분포 함수


분포 함수는 창 프레임 정의를 받아들이지 않고 순서대로 배열해야 합니다.

퍼센트 랭킹


PERCENT RANK()가 현재 행의 상대 등급을 반환합니다.그것은 간단한 공식 계산을 사용한다. (질 -1)/(총분구 행수 -1).이 값의 범위는 0에서 1까지입니다(0에서 1 포함).

다음 질의에는 백분율 RANK()의 역할이 표시됩니다.이 특정한 예시에서 나는 비용 계산 도시에 따라 데이터를 구분했다.
SELECT customer_id AS cid,
       billing_city AS city,
       total, 
       PERCENT_RANK() over(PARTITION BY billing_city ORDER BY total)
FROM invoice;
   city        | total |    percent_rank
--------------------+-------+---------------------
 Amsterdam     |  0.99 |                   0
 Amsterdam     |  1.98 | 0.16666666666666666
 Amsterdam     |  1.98 | 0.16666666666666666
 Amsterdam     |  3.96 |                 0.5
 Amsterdam     |  8.91 |  0.6666666666666666
 Amsterdam     |  8.94 |  0.8333333333333334
 Amsterdam     | 13.86 |                   1
 Bangalore     |  1.98 |                   0
 Bangalore     |  1.99 |                 0.2
 Bangalore     |  3.96 |                 0.4
 Bangalore     |  5.94 |                 0.6
 Bangalore     |  8.91 |                 0.8
 Bangalore     | 13.86 |                   1
<---------------- TRUNCATED ---------------->

누적 분포


CUME DIST()는 값 세트의 누적 분포를 반환합니다.이 값의 범위는 1/N에서 1이며, 현재 행 값보다 작거나 같은 행의 수를 총 행 수로 나누는 것이 계산 방법입니다.

다음 질의는 CUME DIST()가 실행 중임을 나타냅니다.
SELECT billing_city as city,
       total, 
       CUME_DIST() over(PARTITION BY billing_city ORDER BY total)
FROM invoice;
CUME DIST는 파티션을 강제로 사용하지 않지만 이 예에서는 파티션을 사용하여 도시 내의 누적 분포를 표시합니다.
       city         | total |      cume_dist
--------------------------+-------+---------------------
 Amsterdam           |  0.99 | 0.14285714285714285
 Amsterdam           |  1.98 | 0.42857142857142855
 Amsterdam           |  1.98 | 0.42857142857142855
 Amsterdam           |  3.96 |  0.5714285714285714
 Amsterdam           |  8.91 |  0.7142857142857143
 Amsterdam           |  8.94 |  0.8571428571428571
 Amsterdam           | 13.86 |                   1
 Bangalore           |  1.98 | 0.16666666666666666
 Bangalore           |  1.99 |  0.3333333333333333
 Bangalore           |  3.96 |                 0.5
 Bangalore           |  5.94 |  0.6666666666666666
 Bangalore           |  8.91 |  0.8333333333333334
 Bangalore           | 13.86 |                   1

해석 함수


선두와 낙후


LEAD(args,offset,default)는 현재 줄 뒤에 있는 오프셋 값을 반환합니다.오프셋 후 행이 없으면 기본값이 반환됩니다.지정하지 않으면 오프셋 값은 1이고 기본값은 NULL입니다.

LAG(args, offset, default)는 현재 행 앞에 있는 오프셋 값을 반환합니다.간격띄우기 전에 행이 없으면 기본값이 반환됩니다.지정하지 않으면 오프셋 값은 1이고 기본값은 NULL입니다.

두 함수의 기본값은 줄 값과 호환되는 형식이어야 합니다.따라서 열 데이터 형식과 일치하도록 강제로 변환하거나 :: 연산자를 사용해야 할 수도 있습니다.
오버레이와 오버레이는 모두 ORDER BY 자구가 필요하지만, 창틀의 정의를 받아들이지 않습니다.
다음 질의는 LEAD() 및 LAG()의 역할을 보여 줍니다.기본값을 0으로 설정하려면 전체 열 데이터 형식, 즉 숫자와 일치하도록 데이터 형식을 강제로 변환해야 합니다.
SELECT billing_city AS city,
       invoice_date::DATE as date, 
       total,
       LEAD(total) OVER(
           PARTITION BY billing_city
           ORDER BY invoice_date         
       ) as lead,
       LAG(total, 2, 0::numeric) OVER(
           PARTITION BY billing_city
           ORDER BY invoice_date 
           RANGE BETWEEN UNBOUNDED PRECEDING 
              AND UNBOUNDED FOLLOWING
       ) as lag
FROM invoice;
 city         |    date    | total | lead  |  lag
-------------------+------------+-------+-------+-------
 Amsterdam    | 2009-05-10 |  8.91 |  1.98 |     0
 Amsterdam    | 2010-12-15 |  1.98 |  3.96 |     0
 Amsterdam    | 2011-03-19 |  3.96 |  8.94 |  8.91
 Amsterdam    | 2011-06-21 |  8.94 |  0.99 |  1.98
 Amsterdam    | 2012-02-09 |  0.99 |  1.98 |  3.96
 Amsterdam    | 2013-08-02 |  1.98 | 13.86 |  8.94
 Amsterdam    | 2013-09-12 | 13.86 |       |  0.99
 Bangalore    | 2009-04-05 |  3.96 |  5.94 |     0
 Bangalore    | 2009-07-08 |  5.94 |  1.99 |     0
 Bangalore    | 2010-02-26 |  1.99 |  1.98 |  3.96
 Bangalore    | 2011-08-20 |  1.98 | 13.86 |  5.94
 Bangalore    | 2011-09-30 | 13.86 |  8.91 |  1.99
 Bangalore    | 2012-05-30 |  8.91 |       |  1.98
<------------------ TRUNCATED --------------------> 

첫 번째 및 마지막 값


FIRST VALUE()가 창 프레임의 첫 번째 행의 값을 반환합니다.

LAST VALUE()가 창 프레임의 첫 번째 행의 값을 반환합니다.마지막 값에 대해서는 보통 무계 전도와 무계 후도 사이의 범위를 사용해야 한다.그렇지 않으면 현재 줄의 값을 얻을 수 있습니다.이 동작은 ORDER BY 자구가 있는 기본 창 프레임이 범위 무계와 현재 행 사이에 있기 때문입니다.

다음 조회는 데이터를 비용 계산 도시로 나누고 창 구조의 첫 번째 값과 마지막 값을 가져옵니다.
SELECT billing_city AS city,
       invoice_date::DATE as date, 
       total,
       FIRST_VALUE(total) OVER(
           PARTITION BY billing_city
           ORDER BY invoice_date         
       ) as first,
       LAST_VALUE(total) OVER(
           PARTITION BY billing_city
           ORDER BY invoice_date 
           RANGE BETWEEN UNBOUNDED PRECEDING 
              AND UNBOUNDED FOLLOWING
       ) as last
FROM invoice;
  city        |    date    | total | first | last
-------------------+------------+-------+-------+-------
 Amsterdam    | 2009-05-10 |  8.91 |  8.91 | 13.86
 Amsterdam    | 2010-12-15 |  1.98 |  8.91 | 13.86
 Amsterdam    | 2011-03-19 |  3.96 |  8.91 | 13.86
 Amsterdam    | 2011-06-21 |  8.94 |  8.91 | 13.86
 Amsterdam    | 2012-02-09 |  0.99 |  8.91 | 13.86
 Amsterdam    | 2013-08-02 |  1.98 |  8.91 | 13.86
 Amsterdam    | 2013-09-12 | 13.86 |  8.91 | 13.86
 Bangalore    | 2009-04-05 |  3.96 |  3.96 |  8.91
 Bangalore    | 2009-07-08 |  5.94 |  3.96 |  8.91
 Bangalore    | 2010-02-26 |  1.99 |  3.96 |  8.91
 Bangalore    | 2011-08-20 |  1.98 |  3.96 |  8.91
 Bangalore    | 2011-09-30 | 13.86 |  3.96 |  8.91
 Bangalore    | 2012-05-30 |  8.91 |  3.96 |  8.91
<------------------- TRUNCATED ------------------->

안티르


NTILE(n)는 파티션을 가능한 한 n개의 그룹으로 등분하고 1부터 n까지의 정수를 할당합니다.

NTILE에는 ORDER BY 자구가 필요하지만 창틀 정의는 받아들여지지 않습니다.
아래의 조회에서 나는 비용을 계산하는 도시에 따라 데이터를 구분하고 각 구역을 세 조로 나눈다.
SELECT billing_city AS city,
       total,
       NTILE(3) OVER(PARTITION BY billing_city)
FROM invoice;
        city         | total | ntile
--------------------------+-------+-------
 Amsterdam           |  1.98 |     1
 Amsterdam           | 13.86 |     1
 Amsterdam           |  0.99 |     1
 Amsterdam           |  8.91 |     2
 Amsterdam           |  8.94 |     2
 Amsterdam           |  3.96 |     3
 Amsterdam           |  1.98 |     3
 Bangalore           |  1.99 |     1
 Bangalore           |  8.91 |     1
 Bangalore           |  1.98 |     2
 Bangalore           | 13.86 |     2
 Bangalore           |  3.96 |     3
 Bangalore           |  5.94 |     3
<------------- TRUNCATED ----------->

n값


n VALUE(args, n)는 창 상자의 n번째 행의 값을 반환하고 해당 행이 없으면 NULL을 반환합니다.카운트는 1부터 시작합니다.

ORDER BY는 필요하지 않지만 LAST VALUE 함수와 유사한 프레임을 주의해야 합니다.ORDER BY 자구를 사용하는 경우 올바른 값을 얻기 위해 무계 전면과 무계 후면 사이의 범위를 지정해야 할 수 있습니다.
아래의 조회에서 나는 모든 비용을 계산하는 도시의 데이터에 대해 구역을 나누고 총수를 아래로 정렬하여 각 구역의 두 번째 큰 총수를 얻는다.
SELECT billing_city AS city,
       total,
       NTH_VALUE(total, 2) OVER(
            PARTITION BY billing_city
            ORDER BY total DESC
            RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
        )
FROM invoice;
        city         | total | nth_value
--------------------------+-------+-----------
 Amsterdam           | 13.86 |      8.94
 Amsterdam           |  8.94 |      8.94
 Amsterdam           |  8.91 |      8.94
 Amsterdam           |  3.96 |      8.94
 Amsterdam           |  1.98 |      8.94
 Amsterdam           |  1.98 |      8.94
 Amsterdam           |  0.99 |      8.94
 Bangalore           | 13.86 |      8.91
 Bangalore           |  8.91 |      8.91
 Bangalore           |  5.94 |      8.91
 Bangalore           |  3.96 |      8.91
 Bangalore           |  1.99 |      8.91
 Bangalore           |  1.98 |      8.91
<--------------- TRUNCATED ------------->

Windows 기능 매개 변수 요구 사항 요약


다음 표는 ORDER BY 자문이 필요한 창 함수와 행, 범위 및 그룹 등의 창 프레임 정의를 수용하는 함수를 요약한 것입니다.
기능
주문 필요
창틀을 받다
평균()
아니오.
예, 그렇습니다.
개수()
아니오.
예, 그렇습니다.
마이크()
아니오.
예, 그렇습니다.
min()
아니오.
예, 그렇습니다.
sum()
아니오.
예, 그렇습니다.
행 번호()
아니오.
아니오.
질()
예, 그렇습니다.
아니오.
조밀순 ()
예, 그렇습니다.
아니오.
비율(순위)
예, 그렇습니다.
아니오.
cume_dist()
예, 그렇습니다.
아니오.
납()
예, 그렇습니다.
아니오.
대기 상태()
예, 그렇습니다.
아니오.
첫 번째 값()
아니오.
예, 그렇습니다.
마지막 값()
아니오.
예, 그렇습니다.
안티르()
예, 그렇습니다.
아니오.
n 값()
아니오.
예, 그렇습니다.

마무리


본문에서, 나는 몇몇 윈도우즈 함수를 개술하였다.내가 사용하는 창 기능은 네 가지로 나뉘는데 그것이 바로 집합, 순위, 분포와 분석이다.다음 글에서 창 함수의 실제 용례를 보여 드리겠습니다.

좋은 웹페이지 즐겨찾기