ARGMAX [analytic]
此函数是仿照数学函数
argmax(f(x))
设计的,返回可使
f(x)
成为最大值的 x 值。同样地,ARGMAX 使用两个实参 target 和 arg,这两个实参均为查询数据集中的列或列表达式。ARGMAX 在 target 中查找具有最大非 null 值的行,并返回该行中的 arg 值。如果有多行包含最大 target 值,ARGMAX 将返回其找到的第一行中的 arg 值。
行为类型
不可变语法
ARGMAX ( target, arg ) OVER ( [ PARTITION BY expression[,...] ] [ window-order-clause ] )
参数
- target, arg
- 查询数据集中的列。
注意
ARGMAX 不支持空间数据类型:GEOMETRY 和 GEOGRAPHY。 OVER()
- 指定以下窗口子句:
-
PARTITION BY expression
:根据 expression 中的值对输入行进行分组(分区),该 expression 解析为查询数据集中的一列或多列。如果忽略此子句,ARGMAX 会将所有输入行作为单分区处理。 -
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
>> \.
ARGMAX 返回 product_name
列中的值,该值可使 users
列中的值最大。在此示例中,ARGMAX 将返回 totp
,表示 totp
服务拥有最大的用户群:
=> SELECT dev_group, product_name, users, ARGMAX(users, product_name) OVER (ORDER BY dev_group ASC) FROM service_info;
dev_group | product_name | users | ARGMAX
-----------+------------------+---------+--------
aspen | trading | 3000 | totp
daffodil | clip share | 3000 | totp
daffodil | streaming | 44123 | totp
hydrangea | e2e sms | | totp
hydrangea | password manager | | totp
hydrangea | totp | 1837363 | totp
iris | chat | 48193 | totp
iris | forum | 48193 | totp
iris | video call | 10203 | totp
orchid | cloud | 990322 | totp
rose | crypto | | totp
(11 rows)
下一个查询对 dev_group
上的数据进行分区,以确定每个开发组创建的最受欢迎的服务。如果分区的 users
列仅包含 NULL 值并使用分区顶部 product_name
中的第一个值打破关系,ARGMAX 将返回 NULL。
=> SELECT dev_group, product_name, users, ARGMAX(users, product_name) OVER (PARTITION BY dev_group ORDER BY product_name ASC) FROM service_info;
dev_group | product_name | users | ARGMAX
-----------+------------------+---------+-----------
iris | chat | 48193 | chat
iris | forum | 48193 | chat
iris | video call | 10203 | chat
orchid | cloud | 990322 | cloud
aspen | trading | 3000 | trading
daffodil | clip share | 3000 | streaming
daffodil | streaming | 44123 | streaming
rose | crypto | |
hydrangea | e2e sms | | totp
hydrangea | password manager | | totp
hydrangea | totp | 1837363 | totp
(11 rows)