programing

특별한 조건으로 그룹화하는 방법

jooyons 2023. 9. 12. 20:00
반응형

특별한 조건으로 그룹화하는 방법

현재 이 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

EDIT: 답변에서 수정된 쿼리

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;

@bfavaretto는 그에게 친절하지만, 당신이 모르면,username접두사 또는 접두사가 다르거나 다음과 같이 사용할 수 있습니다.

GROUP BY CASE
             WHEN REGEXP_LIKE(username, '^\d+$') THEN 'GRP_OTHERS'
                                                 ELSE username
         END

그다지 효율적이지는 않지만 다음과 같이 작동해야 합니다.

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;

특정 이름 패턴 대신 작은 그룹을 하나의 버킷에 넣어 작업을 수행하고자 할 경우 다음을 사용할 수 있습니다.

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)

언급URL : https://stackoverflow.com/questions/10763043/how-to-group-by-with-a-special-condition

반응형