SQL 코드카타_Find Invalid IP Addresses
# 목적, 목표 : 유효하지 않은 ip 모두 추출
# 필요한 컬럼 : log_id, ip, invalid_count
# 컬럼 조건 : invalid_count = count(ip)
# 사용할 테이블 : logs
# join key : 없음
# 테이블 조건 : 없음
# 필요한 그룹 : ip
# 필요한 그룹 조건 : 없음
# 정렬 기준 : invalid_count desc, ip desc
# 주의사항 : 유효하지 않은 ip 조건
WITH A AS ( # '.' 기준으로 octet 분리 및 octet 개수 count
SELECT log_id, ip, substring_index(ip, '.', 1) as one,
substring_index(substring_index(ip, '.', 2), '.', -1) as two,
substring_index(substring_index(ip, '.', 3), '.', -1) as three,
substring_index(substring_index(ip, '.', 4), '.', -1) as four,
LENGTH(ip) - LENGTH(REPLACE(ip, '.', '')) as cnt_octet
FROM logs),
B AS ( # 1번 조건
SELECT log_id, ip
FROM A
WHERE one > 255 or two > 255 or three > 255 or four > 255),
C AS ( # 2번 조건
SELECT log_id, ip
FROM A
WHERE one like '0%' or two like '0%' or three like '0%' or four like '0%'),
D AS ( # 3번 조건
SELECT log_id, ip
FROM A
WHERE cnt_octet < 3 or cnt_octet > 3),
E AS ( # 각 조건별 유효하지 않은 ip UNION
SELECT log_id, ip
FROM B
UNION ALL
SELECT log_id, ip
FROM C
UNION ALL
SELECT log_id, ip
FROM D),
F AS ( # distinct log_id로 중복 제거
SELECT distinct log_id, ip
FROM E)
# 유효하지 않은 ip와 invalid_count 추출 및 내림차순 정렬
SELECT ip, count(ip) as invalid_count
FROM F
GROUP BY ip
ORDER BY invalid_count desc, ip desc