在使用超集时,我有两件事需要帮助。
客户希望看到销售表中排名前10的产品(即:产品数量>300),其余的显示为“其他”(在饼图中)。如何将其他产品动态分组为“其他”?
如果他们按其中一种产品(属于“其他”类别)进行过滤,他们希望能够看到数据。有什么想法吗?
提前非常感谢。
我尝试了以下查询,但它没有达到我的预期:
SELECT
CASE
WHEN t.product IN (SELECT product FROM Sales GROUP BY product HAVING COUNT(*) >= 30) THEN t.product
ELSE 'Others'
END AS grouped_product,
COUNT(*) AS product_count
FROM
Sales AS t
GROUP BY
grouped_product;
输出: 选择排名前 10 的产品,不硬编码 300,其余的将在“其他”中。 使用 Maria-DB
您可以执行聚合来获取产品的数量,然后使用
ROW_NUMBER()
(或 DENSE_RANK()
,如果值相关)在每个分区内分配顺序排名编号 :
并且通过使用
DIV
进行整数除法,我们可以精确定位前 n 个产品(将 3 替换为任何所需的数字):
SELECT (CASE WHEN rn DIV 3 = 0 THEN product ELSE 'Others' END) AS product,
SUM(product_count) AS product_count
FROM (
SELECT *, ROW_NUMBER() OVER (ORDER BY product_count DESC) - 1 AS rn
FROM (
SELECT product, COUNT(*) AS product_count
FROM sales
GROUP BY product
) AS s
) AS g
GROUP BY 1
对于这个数据集:
create table sales (
product VARCHAR(20),
order_id int
);
insert into sales values
('AA', 1),
('AA', 2),
('AA', 3),
('AA', 4),
('BB', 5),
('BB', 6),
('BB', 7),
('CC', 8),
('CC', 9),
('DD', 10);
结果 :
product product_count
AA 4
BB 3
CC 2
Others 1