ANSI SQL 2023 引進了 GREATEST LEAST. 在PostgreSQL 已經支援了很多年了.
與 MAX, MIN 兩個聚合函數不同.先來看一下
create schema s0118;
create table s0118.t0118a (
id int primary key
, player text
, val1 int
, val2 int
, val3 int
);
insert into s0118.t0118a values
(1, '小帥', 10, 20, 30),
(2, '大壯', 9, 8, 7);
select id, player
, greatest(val1, val2, val3)
, least(val1, val2, val3)
from s0118.t0118a;
id | player | greatest | least
----+--------+----------+-------
1 | 小帥 | 30 | 10
2 | 大壯 | 9 | 7
(2 rows)
可以看到不是針對多筆資料中單一欄位計算,可以是多運算式(欄位可以是運算式的組成).
可以用在如查詢,Procedure Function 的運算式,等等.
也可以用來比較日期.
select greatest(date '2023-01-01', date '2023-01-18')
, least(date '2023-01-01', date '2023-01-18');
greatest | least
------------+------------
2023-01-18 | 2023-01-01
對null 的處理.與一般SQL標準函數不同.
SELECT GREATEST(0,NULL), LEAST(0,NULL);
greatest | least
----------+-------
0 | 0
不因NULL的參與,而回傳NULL.
這裡有個月銷售額的例子:按我前往
測試的table與資料,我是用SQL產生SQL來產生的.
為了大家方便,我就用dump出來的 insert 格式.
這種類型的資料,原始數據是 gal, 日期或時間, 銷售 ==聚合=> gal, 月, 月銷售 ==直轉橫=> gal, 1月,2月.....
但是有時候,我們無法取得原始數據,只有整理好的直轉橫資料了.
這時候雖然有 greatest 可以方便取得最大銷售額,但是是幾月呢?
我有做了一點測試,有興趣研究看看的朋友,可以試試看.