How to group by with a special condition

前端 未结 3 1869
旧巷少年郎
旧巷少年郎 2021-01-11 23:47

Currently when I issue this SQL, it gets the distinct username.

I have some distinct usernames, which represent groups, e.g. GRP_BSN.

I would li

相关标签:
3条回答
  • 2021-01-12 00:04

    Not very efficient, but should work:

    SELECT 
        CASE WHEN username LIKE 'GRP%' THEN username ELSE 'GRP_OTHERS' END AS username, 
        COUNT(*)
    FROM host
    WHERE seq BETWEEN 0 AND 2000
    GROUP BY CASE WHEN username LIKE 'GRP%' THEN username ELSE 'GRP_OTHERS' END;
    
    0 讨论(0)
  • 2021-01-12 00:08

    If you wanted to do it by putting small groups into one bucket, instead of by a particular name pattern, you could use:

    select (case when cnt > 100 then username else 'OTHER' end), sum(cnt) as cnt
    from (select username, count(*) as cnt
          from host
          where seq between 0 and 2000
          group by username
         ) t
    group by (case when cnt > 100 then username else 'OTHER' end)
    
    0 讨论(0)
  • 2021-01-12 00:19

    @bfavaretto is nice (+1 to him), but if you don't know about username prefix or they are different you can go with something like:

    GROUP BY CASE
                 WHEN REGEXP_LIKE(username, '^\d+$') THEN 'GRP_OTHERS'
                                                     ELSE username
             END
    
    0 讨论(0)
提交回复
热议问题