Допустим, у меня есть таблица со столбцами «имя» и «количество», и я хочу получить первые X продуктов, которые являются наиболее представленными, и еще одну строку, которая является суммой всех других продуктов.
Мы можем взять этот пример сценария SQL в качестве примера:
CREATE TEMPORARY TABLE product
(
name TEXT,
quantity INT
);
INSERT INTO product (name, quantity)
VALUES
('carrot', 5),
('tomato', 1),
('potato', 3),
('grape', 8),
('salad', 10);
Из этого набора образцов я хочу получить такой результат:
name quantity
----------------
salad 10
grape 8
others 9
В настоящее время я использую следующее решение, но мне интересно, есть ли что-нибудь более красивое и / или более эффективное:
WITH top AS (
SELECT name,
quantity
FROM product
ORDER BY quantity DESC
LIMIT 2),
without AS (
SELECT 'others' AS other,
sum(product.quantity) AS quantity
FROM product
WHERE product.name NOT IN (SELECT name FROM top)
GROUP BY other)
SELECT name, quantity
FROM (SELECT name, quantity
FROM top
UNION
SELECT other, quantity
FROM without) AS t
ORDER BY quantity DESC;