10

現在、このSQLを発行すると、個別のユーザー名が取得されます。

グループを表すいくつかの異なるユーザー名がありますGRP_BSN

他のすべてのユーザー名(たまたま数値)をグループにグループ化したいと思います。GRP_OTHERS

select username, count(*)
from host
where seq between 0 and 2000
group by username;

63149   1
63732   1
64110   2
70987   12
76841   4
GRP_BSN 226
GRP_ASN 243
GRP_DSC 93

私はこのようなことを達成できますか?

GRP_OTHERS 20
GRP_BSN 226
GRP_ASN 243
GRP_DSC 93

編集:回答からの変更されたクエリ

select username, count(*)
from host
  where created_dt 
  -- date selection
  between to_date('2012-may-23 00:00:00', 'yyyy-mon-dd hh24:mi:ss') 
  and to_date('2012-may-23 23:59:59', 'yyyy-mon-dd hh24:mi:ss')
GROUP BY CASE
             WHEN REGEXP_LIKE(username, '^\d+$') THEN 'GRP_OTHERS'
                                                 ELSE username
         END;
4

3 に答える 3

13

@bfavarettoは素晴らしいです(彼に+1)が、プレフィックスについて知らない場合、usernameまたはプレフィックスが異なる場合は、次のようなものを使用できます。

GROUP BY CASE
             WHEN REGEXP_LIKE(username, '^\d+$') THEN 'GRP_OTHERS'
                                                 ELSE username
         END
于 2012-05-26T01:54:58.727 に答える
4

あまり効率的ではありませんが、機能するはずです。

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;
于 2012-05-26T01:53:35.637 に答える
3

特定の名前パターンではなく、小さなグループを1つのバケットに入れることでそれを実行したい場合は、次を使用できます。

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)
于 2012-05-26T02:18:34.303 に答える