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个分类,不统计其他分类的主要内容,如果未能解决你的问题,请参考以下文章

mysql join查询,并统计数量

有5个分类,MySQL怎么快速统计出每个分类下数据的总记录?

SQL一次性查询一个字段不同条件下的统计结果(另一张表的统计数量)

SQL一次性查询一个字段不同条件下的统计结果

java 怎样实现记录一段时间内(如一个月)发生的事件,并且对其分类并统计次数?用链表吗 具体如何实现?

MySQL_财务统计各产品品类各城市上周收入毛利表_20161202