美文网首页
Leetcode1435. 制作会话柱状图 (简单)

Leetcode1435. 制作会话柱状图 (简单)

作者: kaka22 | 来源:发表于2020-07-23 14:10 被阅读0次

    题目
    表:Sessions

    +---------------------+---------+
    | Column Name         | Type    |
    +---------------------+---------+
    | session_id          | int     |
    | duration            | int     |
    +---------------------+---------+
    

    session_id 是该表主键
    duration 是用户访问应用的时间, 以秒为单位
    你想知道用户在你的 app 上的访问时长情况。
    因此决定统计访问时长区间分别为 "[0-5>", "[5-10>", "[10-15>" 和 "15 or more" (单位:分钟)的会话数量,并以此绘制柱状图。

    写一个SQL查询来报告(访问时长区间,会话总数)。结果可用任何顺序呈现。

    下方为查询的输出格式:

    Sessions 表:

    +-------------+---------------+
    | session_id  | duration      |
    +-------------+---------------+
    | 1           | 30            |
    | 2           | 199           |
    | 3           | 299           |
    | 4           | 580           |
    | 5           | 1000          |
    +-------------+---------------+
    

    Result 表:

    +--------------+--------------+
    | bin          | total        |
    +--------------+--------------+
    | [0-5>        | 3            |
    | [5-10>       | 1            |
    | [10-15>      | 0            |
    | 15 or more   | 1            |
    +--------------+--------------+
    

    对于 session_id 1,2 和 3 ,它们的访问时间大于等于 0 分钟且小于 5 分钟。
    对于 session_id 4,它的访问时间大于等于 5 分钟且小于 10 分钟。
    没有会话的访问时间大于等于 10 分钟且小于 15 分钟。
    对于 session_id 5, 它的访问时间大于等于 15 分钟。

    解答
    首先得到每个响应时间的对应的区间

    select S.session_id,
    case
    when S.duration <300 then '[0-5>'
    when S.duration <600 then '[5-10>'
    when S.duration <900 then '[10-15>'
    else '15 or more'
    end as bin
    from Sessions as S
    

    然后对bin进行分组统计

    select case
    when S.duration <300 then '[0-5>'
    when S.duration <600 then '[5-10>'
    when S.duration <900 then '[10-15>'
    else '15 or more'
    end as bin,
    count(*) as total
    from Sessions as S
    group by S.bin
    

    但是0的部分显示不出来

    所有需要构造所有的区间段然后进行左连接

    select t1.bin, ifnull(t2.total, 0) as total
    from
    (
        select '[0-5>' as bin union
        select '[5-10>' as bin union
        select '[10-15>' as bin union
        select '15 or more' as bin
    ) as t1
    left join (select case
    when S.duration <300 then '[0-5>'
    when S.duration <600 then '[5-10>'
    when S.duration <900 then '[10-15>'
    else '15 or more'
    end as bin,
    count(*) as total
    from Sessions as S
    group by S.bin) as t2
    on t1.bin = t2.bin;
    

    相关文章

      网友评论

          本文标题:Leetcode1435. 制作会话柱状图 (简单)

          本文链接:https://www.haomeiwen.com/subject/ececlktx.html