Описание
Комбинатор If можно применить к функции argMin,
чтобы с помощью агрегатной функции-комбинатора argMinIf найти значение arg, соответствующее минимальному значению val, для строк, в которых условие истинно.
Функция argMinIf полезна, когда нужно найти значение, связанное
с минимальным значением в наборе данных, но только для строк, удовлетворяющих определённому
условию.
Пример использования
В этом примере мы создадим таблицу, в которой хранятся цены на товары и соответствующие им временные метки,
и с помощью argMinIf найдём самую низкую цену для каждого товара, когда он есть в наличии.
CREATE TABLE product_prices(
product_id UInt32,
price Decimal(10,2),
timestamp DateTime,
in_stock UInt8
) ENGINE = MergeTree
ORDER BY ();
INSERT INTO product_prices VALUES
(1, 10.99, '2024-01-01 10:00:00', 1),
(1, 9.99, '2024-01-01 10:05:00', 1),
(1, 11.99, '2024-01-01 10:10:00', 0),
(2, 20.99, '2024-01-01 11:00:00', 1),
(2, 19.99, '2024-01-01 11:05:00', 1),
(2, 21.99, '2024-01-01 11:10:00', 1);
SELECT
product_id,
argMinIf(price, timestamp, in_stock = 1) AS lowest_price_when_in_stock
FROM product_prices
GROUP BY product_id;Функция argMinIf находит цену, соответствующую самой ранней временной метке для каждого продукта,
но учитывает только строки, где in_stock = 1. Например:
- Продукт 1: Среди строк, где товар есть в наличии, 10.99 имеет самую раннюю временную метку (10:00:00)
- Продукт 2: Среди строк, где товар есть в наличии, 20.99 имеет самую раннюю временную метку (11:00:00)
┌─product_id─┬─lowest_price_when_in_stock─┐
1. │ 1 │ 10.99 │
2. │ 2 │ 20.99 │
└────────────┴────────────────────────────┘