首页 > 解决方案 > 选择关联表中至少有 30 个 id 实例的所有行

问题描述

我有一个关联表 PostToTag,它只包含 2 列 post_id 和 tag_id。我想过滤掉包含 tag_id 的每一行,在 PostToTag 表中该 tag_id 的实例少于 30 个。

SELECT ptt.post_id, ptt.tag_id, COUNT(tag_id) n FROM PostToTag ptt GROUP BY tag_id HAVING n >= 30

上面的代码接近我需要的,但我想获取所有 tag_id,就好像我没有使用 GROUP BY 一样。我习惯于在 R 中使用 dplyr,并且能够在执行聚合函数后取消组合。在 SQL 中“取消分组”的传统方法是什么?

标签: pythonsqlsqlite

解决方案


嗯。. . 使用窗口函数:

SELECT ptt.*
FROM (SELECT ptt.*,
             COUNT(*) OVER (PARTITION BY ptt.tag_id) as cnt
      FROM PostToTag ptt 
     ) ptt
WHERE cnt >= 30;

推荐阅读