ClickHouse/docs/en/sql-reference/aggregate-functions/reference/argmin.md
2023-06-05 16:43:07 -03:00

3.6 KiB

slug sidebar_position
/en/sql-reference/aggregate-functions/reference/argmin 105

argMin

Calculates the arg value for a minimum val value. If there are several different values of arg for minimum values of val, returns the first of these values encountered. Both parts the arg and the min behave as aggregate functions, they both skip Null during processing and return not-Null values if not-Null values are available.

Syntax

argMin(arg, val)

Arguments

  • arg — Argument.
  • val — Value.

Returned value

  • arg value that corresponds to minimum val value.

Type: matches arg type.

Example

Input table:

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

Query:

SELECT argMin(user, salary) FROM salary

Result:

┌─argMin(user, salary)─┐
│ worker               │
└──────────────────────┘

Extended example

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), min(b) from test;
┌─argMin(a, b)─┬─min(b)─┐
 a                  0  -- argMin = a because it the first not-Null value, min(b) is from another row!
└──────────────┴────────┘

select argMin(tuple(a), b) from test;
┌─argMin(tuple(a), b)─┐
 (NULL)               -- Tuple allows to get Null value.
└─────────────────────┘

select (argMin((a, b), b) as t).1 argMinA, t.2 argMinB from test;
┌─argMinA─┬─argMinB─┐
 ᴺᵁᴸᴸ           0  -- you can use Tuple and get both (all - tuple(*) ) columns for the according max(b)
└─────────┴─────────┘

select argMin(a, b), min(b) from test where a is Null and b is Null;
┌─argMin(a, b)─┬─min(b)─┐
 ᴺᵁᴸᴸ            ᴺᵁᴸᴸ  -- Nulls are not skipped because only Null values are available
└──────────────┴────────┘

select argMin(a, (b, a)), min(tuple(b, a)) from test;
┌─argMin(a, tuple(b, a))─┬─min(tuple(b, a))─┐
 d                       (NULL,NULL)       'd' is the first Not null value for the min
└────────────────────────┴──────────────────┘

select argMin((a, b), (b, a)), min(tuple(b, a)) from test;
┌─argMin(tuple(a, b), tuple(b, a))─┬─min(tuple(b, a))─┐
 (NULL,NULL)                       (NULL,NULL)      
└──────────────────────────────────┴──────────────────┘

select argMin(a, tuple(b)) from test;
┌─argMax(a, tuple(b))─┐
 b                    -- Tuple can be used in `Min` to not skip Nulls in `Min`
└─────────────────────┘

See also