

 Amazon Redshift 將不再支援從修補程式 198 開始建立新的 Python UDFs。現有 Python UDF 將繼續正常運作至 2026 年 6 月 30 日。如需詳細資訊，請參閱[部落格文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 彙總函數
<a name="c_Aggregate_Functions"></a>

**Topics**
+ [ANY\$1VALUE 函數](r_ANY_VALUE.md)
+ [APPROXIMATE PERCENTILE\$1DISC 函數](r_APPROXIMATE_PERCENTILE_DISC.md)
+ [AVG 函數](r_AVG.md)
+ [COUNT 函數](r_COUNT.md)
+ [LISTAGG 函數](r_LISTAGG.md)
+ [MAX 函數](r_MAX.md)
+ [MEDIAN 函數](r_MEDIAN.md)
+ [MIN 函數](r_MIN.md)
+ [PERCENTILE\$1CONT 函數](r_PERCENTILE_CONT.md)
+ [STDDEV\$1SAMP 和 STDDEV\$1POP 函數](r_STDDEV_functions.md)
+ [SUM 函數](r_SUM.md)
+ [VAR\$1SAMP 和 VAR\$1POP 函數](r_VARIANCE_functions.md)

彙總函數從一組輸入值計算單一結果值。

使用彙總函數的 SELECT 陳述式可以包含兩個選用子句：GROUP BY 和 HAVING。以下是這些子句的語法 (以 COUNT 函數為範例)：

```
SELECT count (*) expression FROM table_reference
WHERE condition [GROUP BY expression ] [ HAVING condition]
```

GROUP BY 子句依一或多個指定欄中的唯一值來彙總和分組結果。HAVING 子句將傳回的結果限定於特定彙總條件為 true 的列，例如 count (\$1) > 1。HAVING 子句的使用方式與 WHERE 根據欄的值來限定列一樣。如需這些額外子句的範例，請參閱 [COUNT](r_COUNT.md)。

彙總函數不接受巢狀彙總函數或範圍函數做為引數。

# ANY\$1VALUE 函數
<a name="r_ANY_VALUE"></a>

ANY\$1VALUE 函數從輸入運算式值非確定性傳回任何值。如果輸入表達式不會傳回任何資料列，此函數會傳回 `NULL`。如果輸入表達式中有 `NULL` 值，函數也會傳回 `NULL`。如果輸入包含的 `NULL` 值混合了非 `NULL` 的值，則可能會傳回 `NULL`。如果所有值都是 `NULL`，則會傳回 `NULL`。如果沒有符合條件的列，則會傳回 `NULL`。

## 語法
<a name="r_ANY_VALUE-synopsis"></a>

```
ANY_VALUE( [ DISTINCT | ALL ] expression )
```

## 引數
<a name="r_ANY_VALUE-arguments"></a>

DISTINCT \$1 ALL  
指定 DISTINCT 或 ALL 可從輸入運算式值傳回任何值。DISTINCT 引數沒有任何作用，而且會被忽略。

 *expression *   
函數運算的目標欄或運算式。*expression* 是下列其中一種資料類型：  
+ SMALLINT
+ INTEGER
+ BIGINT
+ DECIMAL
+ REAL
+ DOUBLE PRECISION
+ BOOLEAN
+ CHAR
+ VARCHAR
+ DATE
+ TIMESTAMP
+ TIMESTAMPTZ
+ TIME
+ TIMETZ
+ INTERVAL YEAR TO MONTH
+ INTERVAL DAY TO SECOND
+ VARBYTE
+ SUPER
+ HLLSKETCH
+ GEOMETRY
+ GEOGRAPHY

## 傳回值
<a name="r_ANY_VALUE-returns"></a>

傳回與 *expression* 相同的資料類型。

## 使用須知
<a name="r_ANY_VALUE-usage-notes"></a>

如果指定欄 ANY\$1VALUE 函數的陳述式也包含第二個欄參考，則第二個欄必須出現在 GROUP BY 子句中，或包含在彙總函數中。

## 範例
<a name="r_ANY_VALUE-examples"></a>

這些範例使用《Amazon Redshift 入門指南》**中的[步驟 4：從 Amazon S3 載入範例資料](https://docs.aws.amazon.com/redshift/latest/gsg/rs-gsg-create-sample-db.html)中建立的事件表格。下列範例會傳回事件名稱為 Eagles 的任何 dateid 的執行個體。

```
select any_value(dateid) as dateid, eventname from event where eventname ='Eagles' group by eventname;
```

以下是結果。

```
dateid | eventname
-------+---------------
 1878  | Eagles
```

下列範例會傳回事件名稱為 Eagles 或 Cold War Kids 的任何 dateid 的執行個體。

```
select any_value(dateid) as dateid, eventname from event where eventname in('Eagles', 'Cold War Kids') group by eventname;
```

以下是結果。

```
dateid | eventname
-------+---------------
 1922  | Cold War Kids
 1878  | Eagles
```

# APPROXIMATE PERCENTILE\$1DISC 函數
<a name="r_APPROXIMATE_PERCENTILE_DISC"></a>

APPROXIMATE PERCENTILE\$1DISC 是採用離散分佈模型的反向分佈函數。它採用百分位數值和排序規格，且會傳回給定集裡的一個元素。近似法可讓函數執行較快，其相對錯誤率低到約 0.5%。

對於給定的*百分位數*值，APPROXIMATE PERCENTILE\$1DISC 使用分位數摘要演算法，大致估計 ORDER BY 子句中的表達式的離散百分位數。APPROXIMATE PERCENTILE\$1DISC 傳回的值具有大於或等於*百分位數*的最小累積分佈值 (根據相同的排序規格)。

## 語法
<a name="r_APPROXIMATE_PERCENTILE_DISC-synopsis"></a>

```
APPROXIMATE  PERCENTILE_DISC ( percentile )
WITHIN GROUP (ORDER BY expr)
```

## 引數
<a name="r_APPROXIMATE_PERCENTILE_DISC-arguments"></a>

 *percentile*   
介於 0 和 1 之間的數值常數。計算時會忽略 Null。

WITHIN GROUP ( ORDER BY *expr*)   
此子句指定要排序和計算百分位數的數值或日期/時間值。

## 傳回值
<a name="r_APPROXIMATE_PERCENTILE_DISC-returns"></a>

資料類型與 WITHIN GROUP 子句中的 ORDER BY 表達式相同。

## 使用須知
<a name="r_APPROXIMATE_PERCENTILE_DISC-usage-notes"></a>

如果 APPROXIMATE PERCENTILE\$1DISC 陳述式包含 GROUP BY 子句，則會限制結果集。限制會根據節點類型和節點數目而不同。如果超出限制，函數會失敗並傳回下列錯誤。

```
GROUP BY limit for approximate percentile_disc exceeded.
```

如果您需要評估的組數超過限制所允許，請考慮使用 [PERCENTILE\$1CONT 函數](r_PERCENTILE_CONT.md)。

## 範例
<a name="r_APPROXIMATE_PERCENTILE_DISC-examples"></a>

下列範例傳回排名前 10 個日期的銷售數量、銷售總計及第五個百分位數值。

```
select top 10 date.caldate,
count(totalprice), sum(totalprice),
approximate percentile_disc(0.5) 
within group (order by totalprice)
from listing
join date on listing.dateid = date.dateid
group by date.caldate
order by 3 desc;

caldate    | count | sum        | percentile_disc
-----------+-------+------------+----------------
2008-01-07 |   658 | 2081400.00 |         2020.00
2008-01-02 |   614 | 2064840.00 |         2178.00
2008-07-22 |   593 | 1994256.00 |         2214.00
2008-01-26 |   595 | 1993188.00 |         2272.00
2008-02-24 |   655 | 1975345.00 |         2070.00
2008-02-04 |   616 | 1972491.00 |         1995.00
2008-02-14 |   628 | 1971759.00 |         2184.00
2008-09-01 |   600 | 1944976.00 |         2100.00
2008-07-29 |   597 | 1944488.00 |         2106.00
2008-07-23 |   592 | 1943265.00 |         1974.00
```

# AVG 函數
<a name="r_AVG"></a>

 AVG 函數傳回輸入表達式值的平均值 (算術平均數)。AVG 函數處理數值，且忽略 NULL 值。

## 語法
<a name="r_AVG-synopsis"></a>

```
AVG ( [ DISTINCT | ALL ] expression )
```

## 引數
<a name="r_AVG-arguments"></a>

 *expression *   
函數運算的目標欄或表達式。*expression* 是下列其中一種資料類型：  
+ SMALLINT
+ INTEGER
+ BIGINT
+ NUMERIC
+ DECIMAL
+ REAL
+ DOUBLE PRECISION
+ SUPER

DISTINCT \$1 ALL   
如果指定引數 DISTINCT，則函數在計算平均值之前，將從指定的表達式中消除所有重複值。如果指定引數 ALL，則函數在計算平均值時會保留表達式中的所有重複值。ALL 為預設值。

## 資料類型
<a name="r_AVG-data-types"></a>

 AVG 函數支援的引數類型包括 SMALLINT、INTEGER、BIGINT、NUMERIC、DECIMAL、REAL、DOUBLE PRECISION 及 SUPER。

AVG 函數支援的傳回類型如下：
+ BIGINT 代表任何整數類型引數
+ DOUBLE PRECISION 代表浮點數引數
+ 針對任何其他引數類型，傳回與運算式相同的資料類型。

具有 NUMERIC 或 DECIMAL 引數的 AVG 函數，結果的預設精確度為 38。結果的小數位數和引數的小數位數相同。例如，DEC(5,2) 欄的 AVG 會傳回 DEC(38,2) 資料類型。

## 範例
<a name="r_AVG-examples"></a>

從 SALES 資料表尋找每次交易的平均銷售數量：

```
select avg(qtysold)from sales;

avg
-----
2
(1 row)
```

尋找所有列表所列出的平均總價：

```
select avg(numtickets*priceperticket) as avg_total_price from listing;

avg_total_price
-----------------
3034.41
(1 row)
```

尋找平均支付價格，按月份分組，依遞減順序排列：

```
select avg(pricepaid) as avg_price, month 
from sales, date
where sales.dateid = date.dateid
group by month
order by avg_price desc;

avg_price | month
-----------+-------
659.34 | MAR
655.06 | APR
645.82 | JAN
643.10 | MAY
642.72 | JUN
642.37 | SEP
640.72 | OCT
640.57 | DEC
635.34 | JUL
635.24 | FEB
634.24 | NOV
632.78 | AUG
(12 rows)
```

# COUNT 函數
<a name="r_COUNT"></a>

 COUNT 函數計算表達式所定義的列數。

COUNT 函數有下列版本。
+ COUNT ( \$1 ) 計算目標資料表中的所有列數，而不論是否包含 Null。
+ COUNT (*expression*) 計算特定欄或表達式中不含 NULL 值的列數。
+ COUNT (DISTINCT *expression*) 計算某欄或表達式中相異非 NULL 值的個數。
+ APPROXIMATE COUNT DISTINCT 會大致估計某欄或運算式中相異非 NULL 值的個數。

## 語法
<a name="r_COUNT-synopsis"></a>

```
COUNT( * | expression )
```

```
COUNT ( [ DISTINCT | ALL ] expression )
```

```
APPROXIMATE COUNT ( DISTINCT expression )
```

## 引數
<a name="r_COUNT-arguments"></a>

 *expression *   
函數運算的目標欄或表達式。COUNT 函數支援所有引數資料類型。

DISTINCT \$1 ALL  
如果指定引數 DISTINCT，則函數在計數之前會從指定的表達式中消除所有重複值。如果指定引數 ALL，則函數在計數時會保留表達式中的所有重複值。ALL 為預設值。

APPROXIMATE  
搭配 APPROXIMATE 一起使用時，COUNT DISTINCT 函數會使用 HyperLogLog 演算法，大致估計某欄或運算式中相異非 NULL 值的個數。使用 APPROXIMATE 關鍵字的查詢執行較快，其相對錯誤率低到約 2%。如果每個查詢或每一組 (若有 group by 子句) 傳回數百萬個以上的大量相異值，則查詢一定要採用近似法。如果相異值較少 (數千個)，則近似法可能比精確計數更慢。APPROXIMATE 只能與 COUNT DISTINCT 一起使用。

## 傳回類型
<a name="c_Supported_data_types_count"></a>

COUNT 函數傳回 BIGINT。

## 範例
<a name="r_COUNT-examples"></a>

計算佛羅里達州的所有使用者人數：

```
select count(*) from users where state='FL';

count
-------
510
```

計算 EVENT 表中的所有事件名稱：

```
select count(eventname) from event;

count
-------
8798
```

計算 EVENT 表中的所有事件名稱：

```
select count(all eventname) from event;

count
-------
8798
```

從 EVENT 資料表計算所有唯一會場 ID 的數目：

```
select count(distinct venueid) as venues from event;

venues
--------
204
```

計算每個賣方列出整批銷售門票超過四張的次數。結果依賣方 ID 分組：

```
select count(*), sellerid from listing 
where numtickets > 4
group by sellerid
order by 1 desc, 2;

count | sellerid
------+----------
12    |    6386
11    |    17304
11    |    20123
11    |    25428
...
```

下列範例比較 COUNT 和 APPROXIMATE COUNT 的傳回值和執行時間。

```
select  count(distinct pricepaid) from sales;
              
count
-------
  4528


Time: 48.048 ms

               
select approximate count(distinct pricepaid) from sales;

count
-------
  4553


Time: 21.728 ms
```

# LISTAGG 函數
<a name="r_LISTAGG"></a>

對於查詢中的每一組，LISTAGG 彙整函數依據 ORDER BY 表達式來排序該組的列，然後將這些值串連成單一字串。

## 語法
<a name="r_LISTAGG-synopsis"></a>

```
LISTAGG( [DISTINCT] aggregate_expression [, 'delimiter' ] ) 
[ WITHIN GROUP (ORDER BY order_list) ]
```

## 引數
<a name="r_LISTAGG-arguments"></a>

DISTINCT  
此子句在串連值之前會從指定的運算式中消除重複值。忽略結尾空格。例如，字串 `'a'` 和 `'a '` 被視為重複。LISTAGG 會使用第一個遇到的值。如需詳細資訊，請參閱[多餘空格的意義](r_Character_types.md#r_Character_types-significance-of-trailing-blanks)。

 *aggregate\$1expression*   
 任何有效運算式 (例如欄名)，用於提供要彙總的值。忽略 NULL 值和空字串。

 *delimiter*   
用來區隔串連值的字串常數。預設值為 NULL。

 *WITHIN GROUP (ORDER BY order\$1list)*   
此子句指定彙總值的排序順序。

## 傳回值
<a name="r_LISTAGG-data-types"></a>

VARCHAR(MAX)。如果結果集大於 VARCHAR 大小上限，則 LISTAGG 會傳回下列錯誤：

```
Invalid operation: Result size exceeds LISTAGG limit
```

## 使用須知
<a name="r_LISTAGG-usage-notes"></a>
+ 如果陳述式包含多個使用 WITHIN GROUP 子句的 LISTAGG 函數，則每一個 WITHIN GROUP 子句必須使用相同的 ORDER BY 值。

  例如，下列陳述式會傳回錯誤。

  ```
  SELECT LISTAGG(sellerid) 
  WITHIN GROUP (ORDER BY dateid) AS sellers,
  LISTAGG(dateid) 
  WITHIN GROUP (ORDER BY sellerid) AS dates
  FROM sales;
  ```

  下列陳述式會成功執行。

  ```
  SELECT LISTAGG(sellerid) 
  WITHIN GROUP (ORDER BY dateid) AS sellers,
  LISTAGG(dateid) 
  WITHIN GROUP (ORDER BY dateid) AS dates
  FROM sales;
  
  SELECT LISTAGG(sellerid) 
  WITHIN GROUP (ORDER BY dateid) AS sellers,
  LISTAGG(dateid) AS dates
  FROM sales;
  ```
+ 您無法使用 LISTAGG、PERCENTILE\$1CONT 和 MEDIAN 彙總函數搭配其他不同的彙總函數使用。

## 範例
<a name="r_LISTAGG-examples"></a>

下列範例彙總賣方 ID，依賣方 ID 排序。

```
SELECT LISTAGG(sellerid, ', ') 
WITHIN GROUP (ORDER BY sellerid) 
FROM sales
WHERE eventid = 4337;

listagg                                                                                                                                 
----------------------------------------------------------------------------------------------------------------------------------------
380, 380, 1178, 1178, 1178, 2731, 8117, 12905, 32043, 32043, 32043, 32432, 32432, 38669, 38750, 41498, 45676, 46324, 47188, 47188, 48294
```

下列範例使用 DISTINCT 傳回唯一賣方 ID 的清單。

```
SELECT LISTAGG(DISTINCT sellerid, ', ') 
WITHIN GROUP (ORDER BY sellerid) 
FROM sales
WHERE eventid = 4337;

listagg                                                                                    
-------------------------------------------------------------------------------------------
380, 1178, 2731, 8117, 12905, 32043, 32432, 38669, 38750, 41498, 45676, 46324, 47188, 48294
```

下列範例彙總賣方 ID，依日期順序排序。

```
SELECT LISTAGG(sellerid, ', ')  
WITHIN GROUP (ORDER BY dateid) 
FROM sales
WHERE eventid = 4337;

   listagg
-----------------------------------------------------------------------------------------------------------------------------------------
 41498, 47188, 47188, 1178, 1178, 1178, 380, 45676, 46324, 48294, 32043, 32043, 32432, 12905, 8117, 38750, 2731, 32432, 32043, 380, 38669
```

下列範例以縱線分隔清單傳回 ID 為 660 的買方的銷售日期。

```
SELECT LISTAGG(
    (SELECT caldate FROM date WHERE date.dateid=sales.dateid), ' | '    
)
WITHIN GROUP (ORDER BY sellerid DESC, salesid ASC)
FROM sales
WHERE buyerid = 660;

             listagg
-------------------------------------------------
2008-07-16 | 2008-07-09 | 2008-01-01 | 2008-10-26
```

下列範例以逗號分隔清單傳回買方 ID 660、661 和 662 的銷售 ID。

```
SELECT buyerid, 
LISTAGG(salesid,', ')
WITHIN GROUP (ORDER BY salesid) AS sales_id
FROM sales
WHERE buyerid BETWEEN 660 AND 662
GROUP BY buyerid
ORDER BY buyerid;
            
buyerid |                sales_id
--------+-----------------------------------------------------
660     | 32872, 33095, 33514, 34548
661     | 19951, 20517, 21695, 21931
662     | 3318, 3823, 4215, 51980, 53202, 55908, 57832, 171603
```

# MAX 函數
<a name="r_MAX"></a>

 MAX 函數傳回一個列集的最大值。可使用 DISTINCT 或 ALL，但不影響結果。

## 語法
<a name="r_MAX-synopsis"></a>

```
MAX ( [ DISTINCT | ALL ] expression )
```

## 引數
<a name="r_MAX-arguments"></a>

 *expression *   
函數運算的目標欄或表達式。*expression* 是下列其中一種資料類型：  
+ SMALLINT
+ INTEGER
+ BIGINT
+ DECIMAL
+ REAL
+ DOUBLE PRECISION
+ CHAR
+ VARCHAR
+ DATE
+ TIMESTAMP
+ TIMESTAMPTZ
+ TIME
+ TIMETZ
+ VARBYTE
+ SUPER

DISTINCT \$1 ALL   
如果指定引數 DISTINCT，則函數在計算最大值之前，將從指定的表達式中消除所有重複值。如果指定引數 ALL，則函數在計算最大值時會保留表達式中的所有重複值。ALL 為預設值。

## 資料類型
<a name="c_Supported_data_types_max"></a>

傳回與 *expression* 相同的資料類型。MIN 函數的布林同等函數為 [BOOL\$1AND 函數](r_BOOL_AND.md)，MAX 的布林同等函數為 [BOOL\$1OR 函數](r_BOOL_OR.md)。

## 範例
<a name="r_MAX-examples"></a>

從所有銷售中尋找最高支付價格：

```
select max(pricepaid) from sales;

max
----------
12624.00
(1 row)
```

從所有銷售中尋找每張門票的最高支付價格：

```
select max(pricepaid/qtysold) as max_ticket_price
from sales;

max_ticket_price
-----------------
2500.00000000
(1 row)
```

# MEDIAN 函數
<a name="r_MEDIAN"></a>

計算值範圍的中值。忽略範圍內的 `NULL` 值。

MEDIAN 是採用連續分佈模型的反向分佈函數。

MEDIAN 是 [PERCENTILE\$1CONT](r_PERCENTILE_CONT.md) 的特殊情況。

## 語法
<a name="r_MEDIAN-synopsis"></a>

```
MEDIAN(median_expression)
```

## 引數
<a name="r_MEDIAN-arguments"></a>

 *median\$1expression*   
函數運算的目標欄或表達式。

## 資料類型
<a name="r_MEDIAN-data-types"></a>

傳回類型取決於 *median\$1expression* 的資料類型。下表顯示每一個 *median\$1expression* 資料類型的傳回類型。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_MEDIAN.html)

## 使用須知
<a name="r_MEDIAN-data-type-usage-notes"></a>

如果 *median\$1expression* 引數是以最大精確度 38 位數定義的 `DECIMAL` 資料類型，MEDIAN 可能會傳回不準確的結果或錯誤。如果 MEDIAN 函數的傳回值超過 38 位數，會將結果截斷為適合長度，導致精確度降低。在插補期間，如果中間結果超過最大精確度，則會發生數值溢位，且函數會傳回錯誤。為了避免這些情況，建議使用精確度較低的資料類型，或將 *median\$1expression* 引數轉換為較低精確度。

如果陳述式中多次呼叫會排序的彙總函數 (LISTAGG、PERCENTILE\$1CONT 或 MEDIAN)，則所有呼叫必須使用相同的 ORDER BY 值。請注意，MEDIAN 會對表達式值套用隱含的 order by。

例如，下列陳述式會傳回錯誤。

```
SELECT TOP 10 salesid, SUM(pricepaid), 
PERCENTILE_CONT(0.6) WITHIN GROUP(ORDER BY salesid),
MEDIAN(pricepaid)
FROM sales 
GROUP BY salesid, pricepaid;

An error occurred when executing the SQL command:
SELECT TOP 10 salesid, SUM(pricepaid), 
PERCENTILE_CONT(0.6) WITHIN GROUP(ORDER BY salesid),
MEDIAN(pricepaid)
FROM sales 
GROUP BY salesid, pricepaid;

ERROR: within group ORDER BY clauses for aggregate functions must be the same
```

下列陳述式會成功執行。

```
SELECT TOP 10 salesid, SUM(pricepaid), 
PERCENTILE_CONT(0.6) WITHIN GROUP(ORDER BY salesid),
MEDIAN(salesid)
FROM sales 
GROUP BY salesid, pricepaid;
```

## 範例
<a name="r_MEDIAN-examples"></a>

下列範例使用 TICKIT 範例資料庫。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

下列範例顯示 MEDIAN 產生與 PERCENTILE\$1CONT(0.5) 相同的結果。

```
SELECT TOP 10 DISTINCT sellerid, qtysold, 
PERCENTILE_CONT(0.5) WITHIN GROUP(ORDER BY qtysold),
MEDIAN(qtysold) 
FROM sales
GROUP BY sellerid, qtysold;

+----------+---------+-----------------+--------+
| sellerid | qtysold | percentile_cont | median |
+----------+---------+-----------------+--------+
|        2 |       2 |               2 |      2 |
|       26 |       1 |               1 |      1 |
|       33 |       1 |               1 |      1 |
|       38 |       1 |               1 |      1 |
|       43 |       1 |               1 |      1 |
|       48 |       2 |               2 |      2 |
|       48 |       3 |               3 |      3 |
|       77 |       4 |               4 |      4 |
|       85 |       4 |               4 |      4 |
|       95 |       2 |               2 |      2 |
+----------+---------+-----------------+--------+
```

下列範例會找出每個 sellerid 售出的中位數量。

```
SELECT sellerid, 
MEDIAN(qtysold)
FROM sales
GROUP BY sellerid
ORDER BY sellerid
LIMIT 10;

+----------+--------+
| sellerid | median |
+----------+--------+
|        1 |    1.5 |
|        2 |      2 |
|        3 |      2 |
|        4 |      2 |
|        5 |      1 |
|        6 |      1 |
|        7 |    1.5 |
|        8 |      1 |
|        9 |      4 |
|       12 |      2 |
+----------+--------+
```

若要驗證第一個 sellerid 的先前查詢結果，請使用下列範例。

```
SELECT qtysold 
FROM sales 
WHERE sellerid=1;

+---------+
| qtysold |
+---------+
|       2 |
|       1 |
+---------+
```

# MIN 函數
<a name="r_MIN"></a>

 MIN 函數傳回一個列集的最小值。可使用 DISTINCT 或 ALL，但不影響結果。

## 語法
<a name="r_MIN-synopsis"></a>

```
MIN ( [ DISTINCT | ALL ] expression )
```

## 引數
<a name="r_MIN-arguments"></a>

 *expression *   
函數運算的目標欄或表達式。*expression* 是下列其中一種資料類型：  
+ SMALLINT
+ INTEGER
+ BIGINT
+ DECIMAL
+ REAL
+ DOUBLE PRECISION
+ CHAR
+ VARCHAR
+ DATE
+ TIMESTAMP
+ TIMESTAMPTZ
+ TIME
+ TIMETZ
+ VARBYTE
+ SUPER

DISTINCT \$1 ALL  
如果指定引數 DISTINCT，則函數在計算最小值之前，將從指定的表達式中消除所有重複值。如果指定引數 ALL，則函數在計算最小值時會保留表達式中的所有重複值。ALL 為預設值。

## 資料類型
<a name="c_Supported_data_types_min"></a>

 傳回與 *expression* 相同的資料類型。MIN 函數的布林同等函數為 [BOOL\$1AND 函數](r_BOOL_AND.md)，MAX 的布林同等函數為 [BOOL\$1OR 函數](r_BOOL_OR.md)。

## 範例
<a name="r_MIN-examples"></a>

從所有銷售中尋找最低支付價格：

```
select min(pricepaid) from sales;

min
-------
20.00
(1 row)
```

從所有銷售中尋找每張門票的最低支付價格：

```
select min(pricepaid/qtysold)as min_ticket_price
from sales;

min_ticket_price
------------------
20.00000000
(1 row)
```

# PERCENTILE\$1CONT 函數
<a name="r_PERCENTILE_CONT"></a>

PERCENTILE\$1CONT 是採用連續分佈模型的反向分佈函數。它採用百分位數值和排序規格，且會傳回插入值，該值將根據排序規格落入給定的百分位數值。

PERCENTILE\$1CONT 在值排序後計算值之間的線性插值。此函數在列根據排序規格來排序後，使用彙總群組中的百分位數值 `(P)` 和非 Null 列數 `(N)` 來計算列號。此列號 `(RN)` 是根據公式 `RN = (1+ (P*(N-1))` 來計算。彙總函數的最終結果是以列號 `CRN = CEILING(RN)` 到 `FRN = FLOOR(RN)` 各列的值之間的線性插值來計算。

最終結果如下。

如果 `(CRN = FRN = RN)`，則結果為 `(value of expression from row at RN)` 

否則結果如下：

`(CRN - RN) * (value of expression for row at FRN) + (RN - FRN) * (value of expression for row at CRN)`.

## 語法
<a name="r_PERCENTILE_CONT-synopsis"></a>

```
PERCENTILE_CONT(percentile)
WITHIN GROUP(ORDER BY expr)
```

## 引數
<a name="r_PERCENTILE_CONT-arguments"></a>

 *percentile*   
介於 0 到 1 之間的數值常數。計算中會忽略 `NULL` 值。

*expr*  
指定要排序和計算百分位數的數值或日期/時間值。

## 傳回值
<a name="r_PERCENTILE_CONT-returns"></a>

傳回類型取決於 WITHIN GROUP 子句中 ORDER BY 表達式的資料類型。下表顯示每一個 ORDER BY 表達式資料類型的傳回類型。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_PERCENTILE_CONT.html)

## 使用須知
<a name="r_PERCENTILE_CONT-usage-notes"></a>

如果 ORDER BY 表達式是以最大精確度 38 位數定義的 DECIMAL 資料類型，PERCENTILE\$1CONT 可能會傳回不準確的結果或錯誤。如果 PERCENTILE\$1CONT 函數的傳回值超過 38 位數，結果會截斷為適合長度，導致精確度降低。在插補期間，如果中間結果超過最大精確度，則會發生數值溢位，且函數會傳回錯誤。為了避免這些情況，建議使用精確度較低的資料類型，或將 ORDER BY 表達式轉換為較低精確度。

如果陳述式中多次呼叫會排序的彙總函數 (LISTAGG、PERCENTILE\$1CONT 或 MEDIAN)，則所有呼叫必須使用相同的 ORDER BY 值。請注意，MEDIAN 會對表達式值套用隱含的 order by。

例如，下列陳述式會傳回錯誤。

```
SELECT TOP 10 salesid, SUM(pricepaid), 
PERCENTILE_CONT(0.6) WITHIN GROUP(ORDER BY salesid),
MEDIAN(pricepaid)
FROM sales 
GROUP BY salesid, pricepaid;

An error occurred when executing the SQL command:
SELECT TOP 10 salesid, SUM(pricepaid), 
PERCENTILE_CONT(0.6) WITHIN GROUP(ORDER BY salesid),
MEDIAN(pricepaid)
FROM sales 
GROUP BY salesid, pricepaid;

ERROR: within group ORDER BY clauses for aggregate functions must be the same
```

下列陳述式會成功執行。

```
SELECT TOP 10 salesid, SUM(pricepaid), 
PERCENTILE_CONT(0.6) WITHIN GROUP(ORDER BY salesid),
MEDIAN(salesid)
FROM sales 
GROUP BY salesid, pricepaid;
```

## 範例
<a name="r_PERCENTILE_CONT-examples"></a>

下列範例使用 TICKIT 範例資料庫。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

下列範例顯示 PERCENTILE\$1CONT(0.5) 產生與 MEDIAN 相同的結果。

```
SELECT TOP 10 DISTINCT sellerid, qtysold, 
PERCENTILE_CONT(0.5) WITHIN GROUP(ORDER BY qtysold),
MEDIAN(qtysold) 
FROM sales
GROUP BY sellerid, qtysold;

+----------+---------+-----------------+--------+
| sellerid | qtysold | percentile_cont | median |
+----------+---------+-----------------+--------+
|        2 |       2 |               2 |      2 |
|       26 |       1 |               1 |      1 |
|       33 |       1 |               1 |      1 |
|       38 |       1 |               1 |      1 |
|       43 |       1 |               1 |      1 |
|       48 |       2 |               2 |      2 |
|       48 |       3 |               3 |      3 |
|       77 |       4 |               4 |      4 |
|       85 |       4 |               4 |      4 |
|       95 |       2 |               2 |      2 |
+----------+---------+-----------------+--------+
```

以下範例會找出 SALES 表格中每個 sellerid 的銷售數量的 PERCENTILE\$1CONT(0.5) 和 PERCENTILE\$1CONT(0.75)。

```
SELECT sellerid, 
PERCENTILE_CONT(0.5) WITHIN GROUP(ORDER BY qtysold) as pct_50,
PERCENTILE_CONT(0.75) WITHIN GROUP(ORDER BY qtysold) as pct_75
FROM sales
GROUP BY sellerid
ORDER BY sellerid
LIMIT 10;

+----------+--------+---------+
| sellerid | pct_50 | pct_75 |
+----------+--------+---------+
|        1 |    1.5 |    1.75 |
|        2 |      2 |    2.25 |
|        3 |      2 |       3 |
|        4 |      2 |       2 |
|        5 |      1 |     1.5 |
|        6 |      1 |       1 |
|        7 |    1.5 |    1.75 |
|        8 |      1 |       1 |
|        9 |      4 |       4 |
|       12 |      2 |    3.25 |
+----------+--------+---------+
```

若要驗證第一個 sellerid 的先前查詢結果，請使用下列範例。

```
SELECT qtysold 
FROM sales 
WHERE sellerid=1;

+---------+
| qtysold |
+---------+
|       2 |
|       1 |
+---------+
```

# STDDEV\$1SAMP 和 STDDEV\$1POP 函數
<a name="r_STDDEV_functions"></a>

 STDDEV\$1SAMP 和 STDDEV\$1POP 函數傳回一組數值 (整數、小數或浮點數) 的樣本標準差和母體標準差。STDDEV\$1SAMP 函數的結果相當於同一組值的樣本變異數平方根。

STDDEV\$1SAMP 和 STDDEV 是同一個函數的同義詞。

## 語法
<a name="r_STDDEV_functions-syntax"></a>

```
STDDEV_SAMP | STDDEV ( [ DISTINCT | ALL ] expression)
STDDEV_POP ( [ DISTINCT | ALL ] expression)
```

表達式必須為整數、小數或浮點數資料類型。不論表達式的資料類型為何，此函數的傳回類型都是雙精確度數字。

**注意**  
標準差是採用浮點運算來計算，所得結果可能稍不精確。

## 使用須知
<a name="r_STDDEV_usage_notes"></a>

對包含單一值的表達式計算樣本標準差 (STDDEV 或 STDDEV\$1SAMP) 時，函數的結果為 NULL，不是 0。

## 範例
<a name="r_STDDEV_functions-examples"></a>

下列查詢傳回 VENUE 資料表的 VENUESEATS 欄中各值的平均值，接著傳回同一組值的樣本標準差和母體標準差。VENUESEATS 是 INTEGER 欄。結果的小數位數簡化到 2 位數。

```
select avg(venueseats),
cast(stddev_samp(venueseats) as dec(14,2)) stddevsamp,
cast(stddev_pop(venueseats) as dec(14,2)) stddevpop
from venue;

avg  | stddevsamp | stddevpop
-------+------------+-----------
17503 |   27847.76 |  27773.20
(1 row)
```

下列查詢傳回 SALES 資料表中的 COMMISSION 欄的樣本標準差。COMMISSION 是 DECIMAL 欄。結果的小數位數簡化到 10 位數。

```
select cast(stddev(commission) as dec(18,10))
from sales;

stddev
----------------
130.3912659086
(1 row)
```

下列查詢將 COMMISSION 欄的樣本標準差轉換為整數。

```
select cast(stddev(commission) as integer)
from sales;

stddev
--------
130
(1 row)
```

下列查詢傳回 COMMISSION 欄的樣本標準差和樣本變異數平方根。這些計算的結果相同。

```
select
cast(stddev_samp(commission) as dec(18,10)) stddevsamp,
cast(sqrt(var_samp(commission)) as dec(18,10)) sqrtvarsamp
from sales;

stddevsamp   |  sqrtvarsamp
----------------+----------------
130.3912659086 | 130.3912659086
(1 row)
```

# SUM 函數
<a name="r_SUM"></a>

 SUM 函數傳回輸入欄或表達式值的總和。SUM 函數處理數值，且忽略 NULL 值。

## 語法
<a name="r_SUM-synopsis"></a>

```
SUM ( [ DISTINCT | ALL ] expression )
```

## 引數
<a name="r_SUM-arguments"></a>

 *expression *   
函數運算的目標欄或表達式。*expression* 是下列其中一種資料類型：  
+ SMALLINT
+ INTEGER
+ BIGINT
+ NUMERIC
+ DECIMAL
+ REAL
+ DOUBLE PRECISION
+ SUPER

DISTINCT \$1 ALL   
如果指定引數 DISTINCT，則函數在計算總和之前，將從指定的表達式中消除所有重複值。如果指定引數 ALL，則函數在計算總和時會保留表達式中的所有重複值。ALL 為預設值。

## 資料類型
<a name="c_Supported_data_types_sum"></a>

SUM 函數支援的引數類型包括 SMALLINT、INTEGER、BIGINT、NUMERIC、DECIMAL、REAL、DOUBLE PRECISION 及 SUPER。

SUM 函數支援的傳回類型如下 
+ BIGINT 代表 BIGINT、SMALLINT 及 INTEGER 引數
+ NUMERIC 代表 NUMERIC 引數
+ DOUBLE PRECISION 代表浮點數引數
+ 針對任何其他引數類型，傳回與運算式相同的資料類型。

具有 NUMERIC 或 DECIMAL 引數的 SUM 函數，結果的預設精確度為 38。結果的小數位數和引數的小數位數相同。例如，DEC(5,2) 欄的 SUM 會傳回 DEC(38,2) 資料類型。

## 範例
<a name="r_SUM-examples"></a>

 從 SALES 資料表中尋找所有已付佣金的總和：

```
select sum(commission) from sales;

sum
-------------
16614814.65
(1 row)
```

尋找佛羅里達州的所有會場的座位數：

```
select sum(venueseats) from venue
where venuestate = 'FL';

sum
--------
250411
(1 row)
```

尋找五月售出的座位數：

```
select sum(qtysold) from sales, date
where sales.dateid = date.dateid and date.month = 'MAY';

sum
-------
32291
(1 row)
```

# VAR\$1SAMP 和 VAR\$1POP 函數
<a name="r_VARIANCE_functions"></a>

 VAR\$1SAMP 和 VAR\$1POP 函數傳回一組數值 (整數、小數或浮點數) 的樣本變異數和母體變異數。VAR\$1SAMP 函數的結果相當於同一組值的平方樣本標準差。

VAR\$1SAMP 和 VARIANCE 是同一個函數的同義詞。

## 語法
<a name="r_VARIANCE_functions-syntax"></a>

```
VAR_SAMP | VARIANCE ( [ DISTINCT | ALL ] expression)
VAR_POP ( [ DISTINCT | ALL ] expression)
```

表達式必須為整數、小數或浮點數資料類型。不論表達式的資料類型為何，此函數的傳回類型都是雙精確度數字。

**注意**  
這些函數的結果可能隨著資料倉儲叢集而有所不同，視每個案例中的叢集組態而定。

## 使用須知
<a name="r_VARIANCE_usage_notes"></a>

對包含單一值的表達式計算樣本變異數 (VARIANCE 或 VAR\$1SAMP) 時，函數的結果為 NULL，不是 0。

## 範例
<a name="r_VARIANCE_functions-examples"></a>

下列查詢傳回 LISTING 資料表中的 NUMTICKETS 欄的四捨五入樣本變異數和母體變異數。

```
select avg(numtickets),
round(var_samp(numtickets)) varsamp,
round(var_pop(numtickets)) varpop
from listing;

avg | varsamp | varpop
-----+---------+--------
10 |      54 |     54
(1 row)
```

下列查詢執行同樣的計算，但將結果轉換為小數值。

```
select avg(numtickets),
cast(var_samp(numtickets) as dec(10,4)) varsamp,
cast(var_pop(numtickets) as dec(10,4)) varpop
from listing;

avg | varsamp | varpop
-----+---------+---------
10 | 53.6291 | 53.6288
(1 row)
```