📍이 문제는 1000키로 무게제한이 있는 버스,탈 수 있는 마지막 사람을 찾아야한다.(1명)
첫번째 사람이 무게제한을 초과하지 않도록 생성해야하며 한번에 1사람만 탈 수 있다...
💬헷갈렸던건?
1000키로 무게제한 인원이 누군지 case when 값을 통해 확인할 수는 있겠는데, 어떻꼐 출력 시키지? 라는 고민이 있었다.
💬그래서?
데이터를 살펴보니 total_weight 순서에 따라 1부터 순서대로 출력되는 Turn 컬럼을 확인하였다.
그렇다면 ,Turn을 기준으로 계속 출력하되 1000이상인 경우 0으로 출력시키고 내림차순해서 상위 1개 출력시키면 되지 않을까 싶었다!


--total_weight column 생성
with cte_1 as (select *,sum(weight) over (order by turn) as Total_Weight
from Queue
order by turn asc)
--버스탈 수 있는 마지막 사람만 출력하기
select person_name
from
-- 1000키로 이하인 경우 넘버링 , 이상인 경우 0으로 처리
--내림차순 + 상위 1개 값 구하는 과정 통해 1000키로 무게제한 인원 1명 출력하기
(select person_name,
case when Total_Weight <=1000 then Turn
else 0
end as counting
from cte_1
order by counting desc limit 1) t
📍조건
각 급여 범주에 대한 은행 계좌 수를 계산
결과 테이블에는 세 가지 범주가 모두 포함
low, average, high 구분 / $20000, $50000
💬주의점
- 이 문제는 새로운 데이터를 select 문을 통해서 새로 생성하는 방법을 알아야한다.
- 새로 생성한 이후 right join을 하고 카테고리별 accout_id을 카운팅함으로써
카테고리별 각 개수를 출력하면 되는 문제이다.
이 문제는 select 문을 새로 생성하는 구문을 만들어야하는 조건이 있어서 chat gpt의 도움을 통해 풀었다 ㅎㅎ
SELECT 문을 통해서 새로 데이터를 만드는 방법
from절을 쓰지 않아도 값이 출력되며 union all을 통해 컬럼 내 값을 계속 이어붙일 수 있다.
예시
with cte as (
select 'aaa' AS category
union all
select 'bbb'
union all
select 'ccc'
)


with cte_1 as (select *,case when income >50000 then 'High Salary'
when income>=20000 then 'Average Salary'
else 'Low Salary'
end as category
from Accounts),
-- select 문을 활용해 데이터 새로 생성하는 방법
cte_2 as (
select 'High Salary' AS category
union all
select 'Average Salary'
union all
select 'Low Salary'
)
select b.category, count(distinct account_id) as accounts_count
from cte_1 a right join cte_2 b on a.category = b.category
group by b.category;
📍조건
연속된 두 학생의 좌석 ID을 교환하는 솔루션 작성하기
학생 수가 홀수라면 마지막 학생의 ID는 교환되지 않음
id 오름차순 으로 정렬된 결과 테이블을 반환합니다 .
💬주의할 점?
학생 수가 홀수라면, 마지막 학생의 ID는 교환되지 않아야한다.(그대로 student 값을 출력해야한다.)
💭lead와 lag 함수
해당 문제는 lead와 lag을 사용해서 앞뒤값을 각 출력시켰으며
mod 함수를 활용해서 짝수인 경우 lag값을 , 홀수인경우 lead값을 출력시켰다.
lead 와 lag 함수를 사용해서 값을 구하면?????
lead함수는 아래 있는 값을 출력시키고 lag함수는 위에 있는 값을 출력시킨다.
- 학생수가 홀수라면 (행 개수가 5개라면) 나머지 하단의 1개 값은 교환할 사람이 없으므로 그대로 출력이 되어야한다.
ifnull을 사용해서 null값이라면 원래 값이었던 student을 출력하도록 하였다.


-- lead 와 lag 함수
with cte_1 as(select * ,
lead(student, 1) over (order by id) as lead_student,
lag(student, 1) over (order by id) as lag_student
from Seat ),
cte_2 as (select id,student as name,case when mod(id ,2) = 0 then lag_student
else lead_student
end as student
from cte_1)
select id, ifnull(student , name ) as student
from cte_2;