【问题标题】:How to count SQL data but also have a field that may be present or not?如何计算 SQL 数据但也有可能存在或不存在的字段?
【发布时间】:2019-09-19 23:09:18
【问题描述】:

我正在尝试找出正确的 SQL 查询来对数据进行分组,但如果至少一个分组的行具有特定值,则还包括一个布尔值 (YES/NO)。

这是一个帮助形象化的具体示例:

假设我有一些这样的数据,可能在一个名为“experiments”的表中,字段如下:

id, experiment_name, user_id, created_at, completed_at

假设我有这些数据:

1, "test experiment", 23, 2019-09-10, NULL

2, "test experiment", 17, 2019-09-15, NULL

3, "test experiment", 23, 2019-09-18, 2019-09-19

4, "test experiment", 23, 2019-09-19, NULL

我想编写一个 SQL 查询,它通过 user_id 执行 group_by 以便我可以进行计数,但还包括一些布尔值,即它们的至少一行是否包含 completed_at 值。

因此,我不能这样做:

SELECT user_id, count(*), completed_at from db group by user_id, completed_at;

结果如下:

user_id  count(*)   completed_at

23            2       NULL

23            1       2019-09-19

17            1       NULL

我想要一些查询,让我最终得到类似的结果:

user_id     count(*)    did_complete?

23              3          TRUE

17              1          FALSE

但我对那部分感到困惑。我尝试在这里搜索 SO,但我什至不知道如何将其表述为一个简短的、可搜索的问题。

【问题讨论】:

    标签: sql group-by count pivot


    【解决方案1】:

    您使用带有条件表达式的聚合函数来检查组中是否至少有一条记录具有非空completed_at 值:

    SELECT 
        user_id, 
        COUNT(*) cnt, 
        MAX(CASE WHEN completed_at IS NOT NULL THEN 1 ELSE 0 END) did_complete
    FROM experiments
    GROUP BY user_id
    

    我通常更喜欢使用 0/1 而不是 TRUE/FALSE,因为数字在不同的 RDBMS 中比布尔值更便于移植。

    【讨论】:

      【解决方案2】:

      您应该选择可空列作为是/否,然后按此字段分组 类似的东西

      SELECT user_id, count(*), switch if is null completed_at then 0 else 1 end as nullableField from db group by user_id, nullableField;
      

      也看这个问题How do I return my records grouped by NULL and NOT NULL?

      【讨论】:

        【解决方案3】:
        SELECT MAX(CASE WHEN completed_at IS NOT NULL THEN 1 ELSE 0 END) AS HasCompleted,
        count(*) AS CNT, 
        MAX(completed_at) LastCompleted 
        from db 
        group by user_id; 
        

        【讨论】:

          猜你喜欢
          • 2011-09-06
          • 1970-01-01
          • 2019-03-26
          • 2012-11-10
          • 2022-01-05
          • 2020-02-19
          • 2013-12-26
          • 2016-06-26
          • 2017-10-02
          相关资源
          最近更新 更多