ARGMIN [analytic]
此函数是仿照数学函数
argmin(f(x))
设计的,返回可使
f(x)
成为最小值的 x 值。同样地,ARGMIN 使用两个实参 target 和 arg,这两个实参均为查询数据集中的列或列表达式。ARGMIN 在 target 中查找具有最小非 null 值的行,并返回该行中的 arg 值。如果有多行包含最小 target 值,ARGMIN 将返回其找到的第一行中的 arg 值。
行为类型
不可变语法
ARGMIN ( target, arg ) OVER ( [ PARTITION BY expression[,...] ] [ window-order-clause ] )
参数
- target, arg
- 查询数据集中的列。
注意
ARGMIN 不支持空间数据类型:GEOMETRY 和 GEOGRAPHY。 OVER()
- 指定以下窗口子句:
-
PARTITION BY expression
:根据 expression 中的值对输入行进行分组(分区),该 expression 解析为查询数据集中的一列或多列。如果忽略此子句,ARGMIN 会将所有输入行作为单分区处理。 -
window-order-clause:指定如何对输入行进行排序。如果
OVER
子句还包括分区子句,则会单独在每个分区中对行进行排序。重要
当有多行包含最小 target 值时,为确保结果一致,请包含一个按 arg 排序的窗口顺序子句。
有关详细信息,请参阅分析函数。
-
示例
创建并填充表 service_info
,其中包含有关各项服务、服务各自的开发组以及服务用户群的信息。users
列中的 NULL 表示该服务尚未发布,因此不会有用户。
=> CREATE TABLE service_info(dev_group VARCHAR(10), product_name VARCHAR(30), users INT);
=> COPY t FROM stdin NULL AS 'null';
>> iris|chat|48193
>> aspen|trading|3000
>> orchid|cloud|990322
>> iris|video call| 10203
>> daffodil|streaming|44123
>> hydrangea|password manager|null
>> hydrangea|totp|1837363
>> daffodil|clip share|3000
>> hydrangea|e2e sms|null
>> rose|crypto|null
>> iris|forum|48193
>> \.
ARGMIN 返回 product_name
列中的值,该值可使 users
列中的值最小。在此示例中,ARGMIN 将返回 totp
,表示 totp
服务具有最小的用户群:
=> SELECT dev_group, product_name, users, ARGMIN(users, product_name) OVER (ORDER BY dev_group ASC) FROM service_info;
dev_group | product_name | users | ARGMIN
-----------+------------------+---------+---------
aspen | trading | 3000 | trading
daffodil | clip share | 3000 | trading
daffodil | streaming | 44123 | trading
hydrangea | e2e sms | | trading
hydrangea | password manager | | trading
hydrangea | totp | 1837363 | trading
iris | chat | 48193 | trading
iris | forum | 48193 | trading
iris | video call | 10203 | trading
orchid | cloud | 990322 | trading
rose | crypto | | trading
(11 rows)
下一个查询对 dev_group
上的数据进行分区,以确定每个开发组创建的最不受欢迎的服务。如果分区的 users
列仅包含 NULL 值并使用分区顶部 product_name
中的第一个值打破关系,ARGMIN 将返回 NULL。
=> SELECT dev_group, product_name, users, ARGMIN(users, product_name) OVER (PARTITION BY dev_group ORDER BY product_name ASC) FROM service_info;
dev_group | product_name | users | ARGMIN
-----------+------------------+---------+------------
iris | chat | 48193 | video call
iris | forum | 48193 | video call
iris | video call | 10203 | video call
orchid | cloud | 990322 | cloud
aspen | trading | 3000 | trading
daffodil | clip share | 3000 | clip share
daffodil | streaming | 44123 | clip share
rose | crypto | |
hydrangea | e2e sms | | totp
hydrangea | password manager | | totp
hydrangea | totp | 1837363 | totp
(11 rows)