product_id name quantity minimum group_id
1 Роза 35см 2 25 0000123
2 Роза 50см 67 25 0000123
3 Роза 80см 15 25 0000123
4 Тюльпан 12 1 0000654
5 Кактус 1 10 0000436
6 Ромашка 1 5 0000756
product_id name quantity minimum group_id
2 Роза 50см 67 25 0000123
4 Тюльпан 12 1 0000654
5 Кактус 1 10 0000436
6 Ромашка 1 5 0000756
SELECT
## product_id
CASE
WHEN COUNT(`products`.`product_id`)=1 THEN ANY_VALUE(`products`.`product_id`)
ELSE (
SELECT
`product_id`
FROM
`products` AS `product_id_sub`
WHERE 1
AND `product_id_sub`.`group_id`=`products`.`group_id`
AND `product_id_sub`.`quantity` > `product_id_sub`.`minimum`
ORDER BY
`product_id_sub`.`minimum` DESC
LIMIT 1
)
END AS 'product_id',
## name
CASE
WHEN COUNT(`products`.`product_id`)=1 THEN ANY_VALUE(`products`.`name`)
ELSE (
SELECT
`name`
FROM
`products` AS `name_sub`
WHERE 1
AND `name_sub`.`group_id`=`products`.`group_id`
AND `name_sub`.`quantity` > `name_sub`.`minimum`
ORDER BY
`name_sub`.`minimum` DESC
LIMIT 1
)
END AS 'name',
## quantity
CASE
WHEN COUNT(`products`.`product_id`)=1 THEN ANY_VALUE(`products`.`quantity`)
ELSE (
SELECT
`quantity`
FROM
`products` AS `quantity_sub`
WHERE 1
AND `quantity_sub`.`group_id`=`products`.`group_id`
AND `quantity_sub`.`quantity` > `quantity_sub`.`minimum`
ORDER BY
`quantity_sub`.`minimum` DESC
LIMIT 1
)
END AS 'quantity',
## minimum
CASE
WHEN COUNT(`products`.`product_id`)=1 THEN ANY_VALUE(`products`.`minimum`)
ELSE (
SELECT
`minimum`
FROM
`products` AS `minimum_sub`
WHERE 1
AND `minimum_sub`.`group_id`=`products`.`group_id`
AND `minimum_sub`.`quantity` > `minimum_sub`.`minimum`
ORDER BY
`minimum_sub`.`minimum` DESC
LIMIT 1
)
END AS 'minimum',
## group_id
`group_id`
FROM `products`
GROUP BY `group_id`
SELECT
CASE
WHEN COUNT(`products`.`product_id`)=1 THEN JSON_OBJECT(
'product_id', ANY_VALUE(`products`.`product_id`),
'name', ANY_VALUE(`products`.`name`),
'quantity', ANY_VALUE(`products`.`quantity`),
'minimum', ANY_VALUE(`products`.`minimum`),
'name', `products`.`group_id`
)
ELSE (
SELECT
JSON_OBJECT(
'product_id', `product_with_required_quantity`.`product_id`,
'name', `product_with_required_quantity`.`name`,
'quantity', `product_with_required_quantity`.`quantity`,
'minimum', `product_with_required_quantity`.`minimum`,
'name', `product_with_required_quantity`.`group_id`
)
FROM
`products` AS `product_with_required_quantity`
WHERE 1
AND `product_with_required_quantity`.`group_id`=`products`.`group_id`
AND `product_with_required_quantity`.`quantity` > `product_with_required_quantity`.`minimum`
ORDER BY
`product_with_required_quantity`.`minimum` DESC
LIMIT 1
)
END AS 'product'
FROM `products`
GROUP BY `group_id`
WITH cte AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY group_id ORDER BY quantity DESC) rn
FROM tablename
)
SELECT *
FROM cte
WHERE rn = 1;