一、明确需求

1. 题目要求:

统计出总作答次数total_pv、试卷已完成作答数complete_pv、已完成的试卷数complete_exam_cnt。

1. 需求解读

  • total_pv:计算作答记录数,数据有多少行,就由多少次
  • complete_pv:已完成作答数——提交记录submit_time is not null
  • complete_exam_cnt:已完成试卷数——提交记录submit_time is not null的exam_id数

二、解题思路

total_pv:count(1),count(*),count(col)都可以,col记得不能为有null的列

  • complete_pv:count(distinct submit_time)
  • complete_exam_cnt:用if或者case函数均可

三、代码展现

select count(distinct id) total_pv
    , count(distinct submit_time) complete_pv
    , count(distinct case when submit_time is not null then exam_id end) complete_exam_cnt
    # 或count(distinct if(submit_time is not null,exam_id,null) complete_exam_cnt
from exam_record

四、拓展

  1. IF(expr1,expr2,expr3):若expr1为True,返回expr2,反之返回expr3
  2. count(*),count(1),count(col)的区别
  • 1、count(*)和count(1)均是对数据列进行计数,功能相同,不同的仅在于计算效率方面不同
  • -2、count(col)计算col中not null的记录。
  • 具体推荐阅读:链接count(*) count(1)与count(col)的区别