【问题标题】:How to select count(distinct) with condition inside groups如何在组内选择具有条件的计数(不同)
【发布时间】:2015-12-29 00:24:43
【问题描述】:

我想要的 SQL 是这样的:

SELECT week_no, type,
 SELECT count(distinct user_id) FROM group WHERE pts > 0
FROM base_table
GROUP BY week_no, type

但是我知道我可以用COUNT(DISTINCT user_id)来统计每个组的用户总数,但是如何统计满足'pts > 0'条件的用户数呢?

我用的是mysql,

谢谢。

【问题讨论】:

  • base_table 可能大于 14GB
  • 为什么不使用 where 子句 where where pts >0?是否需要列出所有 week_no 和类型?

标签: mysql sql syntax


【解决方案1】:

您可能需要条件聚合:

SELECT week_no, type, COUNT(DISTINCT CASE WHEN pts > 0 THEN user_id END)
FROM base_table
GROUP BY week_no, type;

SqlFiddleDemo

【讨论】:

  • mysql好像不支持?
  • @qin.sun 奇怪,demo 运行正常。请分享错误信息
  • @lad2015 我觉得你是对的!我只是参考这个页面(dev.mysql.com/doc/refman/5.7/en/case.html)并使用'END CASE'结束我的案例,删除'CASE'后就可以了,非常感谢!
【解决方案2】:

组的条件由“有”子句构成

SELECT count(user_id) FROM group group by user_id pts > 0

【讨论】:

    【解决方案3】:
    SELECT week_no, type, COUNT(DISTINCT user_id )
    FROM base_table
    where pts > 0
    GROUP BY week_no, type
    

    在 where 子句中过滤用户 ID。

    【讨论】:

    • 发现差异demo。您可以排除某些周和类型
    • 我在 group by 子句之前过滤行,在您的情况下,您在 group by 子句之后过滤行。
    • 我知道,但是您排除数据而不是设置 0。请参阅 OP 在他的问题中使用子查询。当然,与往常一样,这取决于要求。
    • 我没有为每个组计算一次。
    • 您好,感谢您的帮助,但上面的示例只是我查询的一部分,我仍然需要那些 pts == 0 的行。抱歉含糊不清,再次感谢您:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多