SQL JOIN:筛选无关联评论且无同时间关联评论的mpr_metrics行
解决方案
要实现需求——统计无关联评论且所属start_time下无任何带评论的metric的行数,原查询的问题在于仅排除了有直接评论的metric,但未过滤那些和带评论metric同start_time的无评论metric。
正确查询方法1:子查询排除存在评论的时间点
SELECT COUNT(DISTINCT m.id) FROM mpr_metrics m LEFT JOIN mpr_metrics_reviews r ON m.id = r.metric_id WHERE r.id IS NULL AND m.start_time NOT IN ( -- 找出所有存在关联评论的start_time SELECT DISTINCT m2.start_time FROM mpr_metrics m2 JOIN mpr_metrics_reviews r2 ON m2.id = r2.metric_id );
正确查询方法2:窗口函数统计时间点评论数
SELECT COUNT(DISTINCT id) FROM ( SELECT m.id, m.start_time, -- 统计当前start_time下所有关联评论的总数 COUNT(r.id) OVER (PARTITION BY m.start_time) AS total_reviews FROM mpr_metrics m LEFT JOIN mpr_metrics_reviews r ON m.id = r.metric_id ) t -- 仅保留时间点无任何评论的行(自然这些行本身也无关联评论) WHERE total_reviews = 0;
逻辑说明
- 两种方法都会先定位出存在至少一个带评论metric的start_time,然后排除所有属于这些时间点的无评论metric
- 最终仅保留那些:自身无关联评论,且所在start_time下没有任何metric被评论过的行——对应示例中的ID=5的metric,统计结果为1
内容的提问来源于stack exchange,提问作者Darren Gates
相关产品推荐
相关产品推荐

