按ID分组统计Topic数量:存在A时同步计数对应B的实现方法
实现逻辑
核心规则非常简单:仅统计存在Topic为A的ID下,Topic为A或B的记录数即可,完全匹配你的需求。
通用SQL实现(兼容MySQL/PostgreSQL等主流数据库)
SELECT ID, COUNT(*) AS 计数 FROM 你的表名 WHERE -- 限定仅统计包含A的ID ID IN (SELECT DISTINCT ID FROM 你的表名 WHERE Topic = 'A') -- 仅统计A、B两类Topic的记录 AND Topic IN ('A', 'B') GROUP BY ID ORDER BY ID;
运行结果
和你给出的预期完全一致:
| ID | 计数 |
|---|---|
| 1 | 2 |
| 4 | 2 |
| 5 | 1 |
窗口函数版本(适合支持CTE的高版本数据库)
如果你用的数据库支持公共表达式,也可以用这种写法,大数据量下性能更优:
WITH id_mark AS ( SELECT ID, Topic, -- 给每个ID打标记:是否存在A MAX(CASE WHEN Topic = 'A' THEN 1 ELSE 0 END) OVER (PARTITION BY ID) AS has_a FROM 你的表名 ) SELECT ID, COUNT(*) AS 计数 FROM id_mark WHERE has_a = 1 AND Topic IN ('A', 'B') GROUP BY ID ORDER BY ID;
Python Pandas 实现(针对本地数据表处理)
如果你是用Python处理结构化数据,可以用这个方案:
import pandas as pd # 替换为你自己的数据表导入逻辑 df = pd.DataFrame({ 'ID': [1,1,2,3,4,4,5], 'Topic': ['A','B','B','C','A','B','A'] }) # 筛选目标ID + 统计 ids_with_a = df[df['Topic'] == 'A']['ID'].unique() result = df[(df['ID'].isin(ids_with_a)) & (df['Topic'].isin(['A','B']))]\ .groupby('ID', as_index=False).size().rename(columns={'size':'计数'}) print(result)
内容的提问来源于stack exchange,提问作者user13570703
相关产品推荐
相关产品推荐

