SQl查询:统计分类中的产品,一次统计1个分类,不统计其他分类
Posted
技术标签:
【中文标题】SQl查询:统计分类中的产品,一次统计1个分类,不统计其他分类【英文标题】:SQl Query: Count products in category, once product count in 1 category, do not count it in other category 【发布时间】:2019-10-21 12:23:23 【问题描述】:我有一个产品属于不同的类别,1 个产品可能属于多个类别。我想得到“哪个类别的产品最独特”
样本数据:
Table: Category
Category_ID || NAME
1 || clothes
2 || bags
3 || shirts
Tabale: category_joins product + category ids only
Product_ID || Category_ID
1 || 1
5 || 1
1 || 3
2 || 3
3 || 3
计算哪个类别的产品最独特?:
Result
Count || Category_id
1 || 1
3 || 3
Exclude Product_ID "1" from Category_ID "1", because it is in category "3",
and only count Product_ID 1 in Category 3 because Category 3 has most unique products
两个类别中的产品 ID“1”
我想要类别中的产品总数, 但如果产品属于 1 个类别,则不要将其计入另一个类别。
帮我写下它的QUERY。
【问题讨论】:
为什么我们不应该从类别 3 中排除产品 1? 我需要类别 3 的结果才能工作... 【参考方案1】:类别的优先级基于产品数量,如果在Category_ID
上相同。对于每个产品,只取最高优先级的类别。
select Product_ID, Category_ID
from (
select c1.Product_ID, c1.Category_ID, row_number() over (partition by Product_ID order by rnk) priority
from category_joins c1
join (
select Category_ID, row_number() over (order by count(distinct Product_ID) desc, Category_ID) rnk
from category_joins
group by Category_ID
) cr on cr.Category_ID = c1.Category_ID
) t
where priority = 1
Demo
按类别获取唯一分布产品的计数
select Category_ID, count(*) n
from (
select c1.Product_ID, c1.Category_ID, row_number() over (partition by Product_ID order by rnk) priority
from category_joins c1
join (
select Category_ID, row_number() over (order by count(distinct Product_ID) desc, Category_ID) rnk
from category_joins
group by Category_ID
) cr on cr.Category_ID = c1.Category_ID
) t
where priority = 1
group by Category_ID;
【讨论】:
以上是关于SQl查询:统计分类中的产品,一次统计1个分类,不统计其他分类的主要内容,如果未能解决你的问题,请参考以下文章
有5个分类,MySQL怎么快速统计出每个分类下数据的总记录?
SQL一次性查询一个字段不同条件下的统计结果(另一张表的统计数量)