이동준1
아웃풋 공부
이동준1
전체 방문자
오늘
어제
  • 분류 전체보기 (87) N
    • airflow (8)
    • sql (23)
    • aws (12)
    • python (3)
    • 네트워크 (12)
    • 알고리즘 (2)
    • 짧은서평 (27) N

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • regexp
  • 퓨처셀프
  • 고통의 비밀
  • Network
  • 마음의기술 서평
  • 유연함의힘
  • 서평
  • 마음의기술
  • 통증해방
  • AWS
  • 고통의비밀
  • 통증해방 서평
  • 네트워크

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
이동준1

아웃풋 공부

[SQL][HackerRank] The Blunder
sql

[SQL][HackerRank] The Blunder

2023. 1. 3. 21:28

https://www.hackerrank.com/challenges/the-blunder/problem?isFullScreen=true 

 

The Blunder | HackerRank

Query the amount of error in Sam's result, rounded up to the next integer.

www.hackerrank.com

 

Samantha was tasked with calculating the average monthly salaries for all employees in the EMPLOYEES table, but did not realize her keyboard's  key was broken until after completing the calculation. She wants your help finding the difference between her miscalculation (using salaries with any zeros removed), and the actual average salary.

Write a query calculating the amount of error (i.e.: actual - miscalculated average monthly salaries), and round it up to the next integer.

 

문제에서는 다음과 같은 필드를 가진 테이블이 주어진다. Salary는 한달 급여를 의미한다.

 

Samanth는 이 테이블을 이용해 직원들의 평균 한달 급여를 구하려고했다. 그러나, 애석하게도 그녀의 키보드는 고장이 나있었고, 0 자판이 작동하지 않았다고 한다. 그래서 0이 기입되어야 할 자리에 0이 기입되지 못했다.

 

본래의 테이블이 아래와 같다면,

0 버튼이 고장나, 아래와 같이 잘못 기입한 것이다. 안타깝게도 Samanth는 아래와 같이 잘못 기입된 급여로 직원들의 한달 평균 급여를 구했다. (Blunder의 뜻은 '큰 실수'인데, Samanth는 정말로 큰 실수를 한것이다.)

 

주어진 문제에 따르면 우리는 오차(원래 평균 급여 - 잘못계산된 평균 급여)를 구해야 한다. 이 오차를 구하기 위해서는 잘못 입력된 (0이 빠진) 급여의 평균을 구하는 것이 핵심이다. 그리고 이는 REPALCE함수를 활용하면 해결 가능하다.

 

REPLACE 함수는 보통 문자열 내의 특정 글자를 찾아 다른 글자로 치환하는 용도로 쓰인다. 그래서 아래와 같이 함수를 입력하게 되면 필드에 존재하는 A글자를 B로 바꿔준다.

SELECT REPLACE(field, 'A', 'B')
FROM table;

 

REPLACE함수는 문자열의 특정 글자를 치환하는데 사용하지만, 숫자열(?)에 있는 숫자도 치환이 가능하다. REPLACE(salary, 0, '')) 라고 함수를 사용하게 되면, salary는 Integer type임에도 불구하고 salary에 있는 0이 공백으로 치환된다. 즉, Samanth가 잘못 입력한 급여의 형태를 만들 수 있다.

 

게다가 이렇게 REPLACE를 이용해 Integer type의 칼럼의 값을 문자열 처럼 취급해서 조작했으면 연산이 불가할것같지만, 조작 후의 연산도 가능하다 (이런 특징은 프로그래밍 언어와 차이를 보인다). 그래서, AVG(replace(salary, 0, ''))라고 입력해주면 잘못 입력된 급여의 평균을 구하는 것이 가능하다.

 

그후에 정상적으로 구한 급여의 평균과의 차이를 구하고, 올림처리해주면 정답처리 된다. SQL에서는 Integer type의 값도 REPLACE 함수를 이용해 쉽게 조작할 수 있다는 것을 알아두면 좋겠다.

SELECT CEIL(AVG(salary) - AVG(replace(salary, 0, '')))
FROM employees;

'sql' 카테고리의 다른 글

[sql] date_trunc  (0) 2023.12.28
[SQL] Aggregation Without Grouping  (0) 2023.01.04
[SQL][HackerRank] Binary Tree Nodes  (0) 2023.01.02
[SQL][HackerRank] Occupations  (0) 2022.12.27
[SQL] ROW_NUMBER / RANK / DENSE_RANK  (0) 2022.12.27
    'sql' 카테고리의 다른 글
    • [sql] date_trunc
    • [SQL] Aggregation Without Grouping
    • [SQL][HackerRank] Binary Tree Nodes
    • [SQL][HackerRank] Occupations
    이동준1
    이동준1

    티스토리툴바