跳到主要内容
跳到主要内容

argAndMin

计算最小 val 值对应的 argval。如果有多行记录的最小 val 值相同,则返回哪一行对应的 argval 是不确定的。 argmin 两部分都作为聚合函数起作用,在处理过程中都会跳过 Null,并且在存在非 Null 值时返回非 Null 结果。

注意

argMin 的唯一区别是 argAndMin 会同时返回参数和数值。

语法

argAndMin(arg, val)

参数

  • arg — 参数。
  • val — 值。

返回值

  • 与最小 val 值对应的 arg 值。
  • 最小的 val 值。

类型:与 argval 类型依次对应的元组。

示例

输入表:

┌─user─────┬─salary─┐
│ director │   5000 │
│ manager  │   3000 │
│ worker   │   1000 │
└──────────┴────────┘

查询:

SELECT argAndMin(user, salary) FROM salary

结果:

┌─argAndMin(user, salary)─┐
│ ('worker',1000)         │
└─────────────────────────┘

详细示例

CREATE TABLE test
(
    a Nullable(String),
    b Nullable(Int64)
)
ENGINE = Memory AS
SELECT *
FROM VALUES((NULL, 0), ('a', 1), ('b', 2), ('c', 2), (NULL, NULL), ('d', NULL));

SELECT * FROM test;
┌─a────┬────b─┐
│ ᴺᵁᴸᴸ │    0 │
│ a    │    1 │
│ b    │    2 │
│ c    │    2 │
│ ᴺᵁᴸᴸ │ ᴺᵁᴸᴸ │
│ d    │ ᴺᵁᴸᴸ │
└──────┴──────┘

SELECT argMin(a,b), argAndMin(a, b), min(b) FROM test;
┌─argMin(a, b)─┬─argAndMin(a, b)─┬─min(b)─┐
│ a            │ ('a',1)         │      0 │ -- argMin = a,因为它是第一个非 `NULL` 值,而 min(b) 来自另一行!
└──────────────┴─────────────────┴────────┘

SELECT argAndMin(tuple(a), b) FROM test;
┌─argAndMin((a), b)─┐
│ ((NULL),0)        │ -- 'a' `Tuple` 仅包含一个 `NULL` 值,但其本身不是 `NULL`,因此聚合函数不会因该 `NULL` 值而跳过该行
└───────────────────┘

SELECT (argAndMin((a, b), b) as t).1 argMinA, t.2 argMinB from test;
┌─argMinA──┬─argMinB─┐
│ (NULL,0) │       0 │ -- 可以使用 `Tuple` 获取对应 min(b) 的两列(全部列 - tuple(*))
└──────────┴─────────┘

SELECT argAndMin(a, b), min(b) FROM test WHERE a IS NULL and b IS NULL;
┌─argAndMin(a, b)─┬─min(b)─┐
│ ('',0)          │   ᴺᵁᴸᴸ │ -- 由于过滤条件,所有聚合行至少包含一个 `NULL` 值,因此所有行都被跳过,结果为 `NULL`
└─────────────────┴────────┘

SELECT argAndMin(a, (b, a)), min(tuple(b, a)) FROM test;
┌─argAndMin(a, (b, a))─┬─min((b, a))─┐
│ ('a',(1,'a'))        │ (0,NULL)    │ -- 'a' 是 min 对应的第一个非 `NULL` 值
└──────────────────────┴─────────────┘

SELECT argAndMin((a, b), (b, a)), min(tuple(b, a)) FROM test;
┌─argAndMin((a, b), (b, a))─┬─min((b, a))─┐
│ ((NULL,0),(0,NULL))       │ (0,NULL)    │ -- argAndMin 在此返回 ((NULL,0),(0,NULL)),因为 `Tuple` 允许不跳过 `NULL` 值,此时 min(tuple(b, a)) 是该数据集的最小值
└───────────────────────────┴─────────────┘

SELECT argAndMin(a, tuple(b)) FROM test;
┌─argAndMin(a, (b))─┐
│ ('a',(1))         │ -- 可在 `min` 中使用 `Tuple` 以不跳过 b 为 `NULL` 值的行。
└───────────────────┘

另请参阅