1581. Customer Who Visited but Did Not Make Any Transactions
DATEDIFF(date1, date2) : 두 날짜 사이의 일수를 숫자로 표현하는 함수
answer
answer
| studentid | studentname | subject_name | | ---------- | ------------ | ------------ | | 1 | Alice | Programming | | 1 | Alice | Physics | | 1 | Alice...
음수랑 NULL이랑 구분할 것!GROUP BY가 실행될 때, 1 row로 결과가 도출되게 된다. 이 때, 완전 압축되는 것은 아니고 만약 HAVING 절에 사용되는 집계 함수가 있으면 임시 데이터로 값을 가지고 있다가 집계 함수를 실행한 후에 완전 압축된다. 이를 중간
| id | movie | description | rating | | -- | ---------- | ----------- | ------ | | 5 | House card | Interesting | 9.1 | | 1 | War | great 3D | 8.9 |
UnitsSold 테이블에 NULL 값이 있는 테스트 케이스로 인한 오류LEFT JOIN으로 NULL 값을 나타나도록 하려고 했는데 WHERE절로 인해 성립되지 않는다. 따라서 JOIN 조건절로 WHERE 조건절 이동시킨다.DATE 형식에서 BETWEEN을 사용하면 경
SQL 1 단계는 추가적으로 정리하지 않겠다.
Weather Observation Station 4 Weather Observation Station 5 Weather Observation Station 6
→ Subquery returns more than 1 row any 대신 in을 사용해도 되고, JOIN을 사용해도 된다.
| userid | timestamp | action | | ------- | ------------------- | --------- | | 3 | 2021-01-06 03:30:46 | timeout | | 3 | 2021-07-14 14:00:00 | timeout | | 7 | 2021-0...
answer `
FROM / JOIN: 먼저 데이터를 가져올 테이블을 찾는다.WHERE: 조건에 맞는 행을 필터링GROUP BY: 데이터를 그룹화HAVING: 그룹화된 데이터에 조건을 적용SELECT: 데이터를 선택하고, 이때 별칭 정의ORDER BY: 결과 정렬SQL에서는 이 순서대
| userid | contestid | | ------- | ---------- | | 7 | 215 | | 2 | 215 | | 6 | 215 | | 7 | 209 | | 2 | 209 | | 6 | 209 | |...
장르별로 그룹화를 해놓은 상태에서ROUND(AVG(CASE WHEN year = 2010 THEN critic_score END), 2) : OKCASE WHEN g.year = 2011 THEN ROUND(AVG(critic_score), 2) END : Error
answer
SUM(IF(state='approved', 1, 0))→ state가 'approved'인 행의 개수만 세고 싶다. 그러면 이거를 변환하면 COUNT(IF(state='approved', 1, NULL))NULL 값이면 안 세기 때문에 아예 NULL로 설정해서 카운팅
| month | country | transcount | approvedcount | transtotalamount | approvedtotalamount | | ------- | ------- | ----------- | -------------- | ------------------ | --------------------- | | 2018-1...
→ ❎ 틀림.WHERE payment_type = 'credit_card' 조건 빼먹지 말고 체크할 것!하지만 여전히 정답과는 결과가 다르다. 틀린 게 없어보이는데 틀렸으니까 테이블의 컬럼을 다시 한 번 자세히 살펴보자.중복되는 주문 ID가 있을 것 같아서 DISTIN
count(\*)로 주문 수를 확인하면, 단일 order_id에 여러 상품들이 있을 때 문제가 된다. 따라서 category에 CASE문을 걸 때, 반환값을 order_id로 하고 DISTINCT로 중복을 제거해야 한다.
주문일 하루 이전 날짜부터 주문일 당일까지 연속된 주문 건수의 합이런 식으로 하면 하루 뒤의 날짜가 아니라 '2023-11-23' 이런 문자열을 숫자로 변환해 2024라는 숫자가 나올 수 있다. 이는 MySQL에서 + 연산자를 산술 연산만을 위해 존재하기 때문인데, +
answerOUTPUTREPEAT(문자열, 횟수) : 지정된 문자열을 정해진 횟수만큼 반복해서 새로운 문자열을 만드는 함수REVERSE(문자열) : 문자열을 뒤집어서 반환하는 문자열 함수SPACE(길이) : 지정한 길이만큼 공백 문자열 생성LPAD(원본문자열, 원하는총
SQL로 소수 구하기 범위 1 ~ 1000 : 데이터셋이 주어지지 않았기 때문에 간단하게 만들어준다. 만든 데이터셋을 바탕으로 소수를 구한다. 소수는 1과 자기 자신 이외에는 약수가 없는 수이므로 이를 활용한다. 정답의 형식이 2&3&5&7과 같은 형식의 한 줄
custoemr_id마다order_date가 가장 빠른 record만 남기려면? 날짜 순으로 정렬한 다음에 가장 빠른 행만 남기는 방법 (CTE)위 방법을 window function으로 하기
날짜 차이가 1년 미만인 레코드를 구하려면?
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INTERVAL 30 DAY
이 test case에서는 통과하는데 다른 test case에서는 아예 output이 출력되지 않았다. CTE에서 year에 관련된 그룹 조건절이 잘못된 건 알겠는데 왜 결과가 출력조자 되지 않았을까? 그룹화를 하고 그 안에서 가장 오래된 행(MIN(year))만 필터
이렇게 풀면 쿼리 처리 시간이 오래 걸린다. 이러면 줄어들고이러면 더 줄어든다.
이 테스트 케이스에 대한 output이 아래처럼 나온다.count와 같은 집계 함수는 제대로 기능하지만 primary_flag = 'Y'라는 비교문에 대해서 group by로 압축했을 때는 제대로 비교하지 못하고 느슨한 sql에서는 첫 행으로 압축하고 비교한 이후 맞지
WINDOW 함수를 사용하면
RIGHT 말고 SUBSTRING으로 하면
갱신을 해나가는 테이블가장 최신 날짜에서의 데이터 값을 출력product_id로 그룹화 → 그룹화 내에서는 특정 조건으로 분류 불가window function으로 그룹별로 나눠서 날짜 순으로 정렬한 다음에 최상단 값 호출 해당 값이 없을 경우 default로 10 설정
이렇게 작성하면 문제가 CASE에 해당하는 레코드가 없을 경우, category를 그룹화해서 카운팅할 때, 참조할 요소가 cte에 아예 없기 때문에 그 행 자체가 보이지를 않는다. high salary에 해당하는 레코드가 없었다면 cte에서 group by해도 그에 대
1,2/ 3,4 / 5,6 이런 식으로 레코드들을 묶어서 그룹으로 만들려면?ROW_NUMBER()는 써야 될 것 같고even, odd니까 2로 나누면 될텐데 소수점을 올림해서 사용CEIL( (ROW_NUMBER() OVER(ORDER BY id)) / 2 )같은 그룹
가장 많은 수의 리뷰를 남긴 리뷰어를 찾아라. (동률이라면, 사전학적으로 더 빠른 사람의 이름)February 2020에 가장 높은 평점의 영화 제목을 찾아라. 동률이면 사전학적으로 더 빠른 영화의 이름1,2 의 결과는 results 테이블로 출력최대한 자잘하게 쪼개보
A 쿼리가 B 쿼리보다 느린데 LIKE 연산자는 한 글자씩 바이트 단위로 비교해서 맞는지 아닌지만 비교하고, REGEXP는 정규식을 해석하고 컴파일하여 상태 머신(State Machine)이라는 논리 구조를 만든다. 그 후에 데이터를 한 글자씩 읽을 때마다, 다음 상태
CTE에서 requester_id로 그룹화한 테이블과 accepter_id로 그룹화한 테이블에 레코드가 {id:17, num:5}가 각각 있는데 UNION 한 뒤에 id로 그룹화하면 id:17, num:10이 되는 게 아니라 id:17, num:5가 되는 것을 확인할
lat, lon 조합이 유일해야 한다.각각 lat, lon을 count로 2개 이상인지 체크window function으로 (lat, lon)을 파티셔닝하고 count로 체크tiv_2015 값이 중복돼야 한다.파티셔닝하고 정렬을 다시 해야 하기 때문에 window fu
DELETE로 특정 행 삭제하기이런 식으로 조건절에 삭제할 내용을 집어넣음으로써 값을 삭제할 수 있다.여러 테이블을 조인해서 삭제할 때는 DELETE 뒤에 어떤 테이블에서 삭제할 껀지만 지정해주면 된다.Person 테이블에서 email이 중복되는 레코드가 있으면 id
값이 없으면 null을 반환해라.left join 해서 null이 나오도록 하는 방법→ 조인을 굳이 하지 않아도 되는 테이블에서 null 나오게 하겠다고 조인 해버리면 메모리 낭비기 때문에 다른 방법 고안 필요집계 함수 사용 → 입력 데이터가 없으면 자동으로 NULL을
구분자를 설정하고 싶다면 와 같이 separator로 설정할 수 있다.
날짜를 필터링할 때 사용할 수 있는 방법은 크게 세 가지가 있다.A) DATE_FORMATB) BETWEEN A AND BC) A AND B 뭐가 가장 효율적일까?(C) 방법이 가장 효율적이다. DB의 Index 사용 가능 여부 때문인데, order_date를 가공하지
이렇게 하면 mysql에서는 c와 C가 같은 글자이기 때문에 COM으로 input이 들어왔을 때 그대로 출력한다. (?-i)로 대소문자 무시 옵션을 끌 수 있다.아니면 BINARY 옵션을 사용하면 되는데REGEXP에다가 BINARY를 바로 붙이면 DB 설정 상 mail
일차 조건 완료 → 이 테이블 안에서 다시 찾으면 된다.이렇게 풀었을 때, 다음과 같은 에러가 나온다.\*\*Error 1055 (42000): Expression 개별 행을 체크하고 그에 대해서 카운트를 진행하려고 했지만 이미 그룹화가 되어 있어 접근이 불가하다. 따
ARPPU(Average Revenue Per Paying User) : 유료 사용자 1인당 평균 수익ARPPU = 전체 매출액 / 결제 고객 수주문 ID (order_id)로 두 테이블 INNER JOIN
평론가 평점, 사용자 평점이 null 값일 때, 레코드의 결측치를 같은 장르 게임의 평론가 평점의 평균, 사용자 평점의 평균으로 채우는 것이 문제의 요구사항이다. 장르 id로 그룹화를 한다고 했을 때, 그 게임의 id와 같은 값을 어떻게 표현해야 할까?한 장르 별로 평
요일을 구하는 함수 weekday(date) : 월요일(0)부터 일요일(6) dayofweek(date) : 일요일(1)부터 토요일(7) 이걸 월화수목금토일 순으로 정렬하려면 어떻게 해야 될까?
2018년 10월, 2019년 10월 한 달 동안 있었던 자전거 대여/반납의 차2018년 10월 대여 + 반납 건 수 - 2019년 10월 대여 + 반납 건 수bike_id, 대여 정류소 id, 반납 정류소 id가 한 행에 있을 때, 사건 수를 어떻게 세야 할까?bik
split 역할을 수행해주는 함수 SUBSTRING_INDEX를 사용하여 원하는 대로 문자열을 분할한다. 두 번째 띄어쓰기를 기준으로 분할한다고 했을 때, 그 이전 값들을 모두 출력하므로 결과값에 한 번 더 분할을 진행한다.
중앙값을 계산하는 방법홀수 : row_number가 겹치는 단 하나의 행 - CEIL(cnt / 2)짝수 : 중간에 있는 두 개의 행의 평균 row_number / 2계절별로 구별한 행과 pm10만 따로 추출하여 CTE 생성계절 별로 구별해야 하므로틀렸다. window
edge가 친구의 관계를 나타낼 때, node의 위치가 다른 관계에서 값이 유일할 수도 중복될 수도 있다는 점을 고려해야 할 것 같다.쿼리 결과 = 0, 이를 통해서 a,b의 관계가 바뀌어도 중복되는 행은 없음을 알 수 있다. a에만 있는 행이 있을수도 있고, b에만
위도, 경도의 단위가 degree이므로 radian으로 변환RADIANS(lat), RADIANS(lng)updated_at가 자신보다 최근인 정류소 5개 이상LEFT JOIN으로 self join을 한 후에, 조건절에 s_near.updated_at > s.updat
난이도 : 2
난이도 : 2방문자 수 중복하여 카운팅되지 않도록 DISTINCT를 사용하는 것이 포인트인 문제였다.
난이도 : 2 / 정답률 29.17%order_id가 중복되는 레코드들이 있다. 한 주문에 여러 가지 상품들이 포함될 수 있는 방식인 것 같다. 한 레코드에서는 주문 id와 상품 id가 일대일 대응 관계이다.
12개가 나와야 되는데 반환된 쿼리 결과가 7개다. 조건을 다시 한 번 살펴보자. HAVING 절에 furniture / cnt >= 0.4라고 했는데이렇게 하면 furniture의 카테고리 비율이 나오지 주문의 비율이 나오는 게 아니다.주문 수 26count(case
난이도 : 4 / 정답률 65.93%