SELECT
car_id
, ROUND(AVG((DATEDIFF(end_date, start_date)+1)), 1) AS average_duraton
FROM
car_rental_company_rental_history
GROUP BY
car_id
HAVING
ROUND(AVG((DATEDIFF(end_date, start_date)+1)), 1) >= 7
ORDER BY
2 DESC
, 1 DESC
;
WITH temp AS (
SELECT
car_id
, AVG(DATEDIFF(end_date, start_date) + 1) AS average_duration
FROM
car_rental_company_rental_history
GROUP BY
car_id
HAVING
AVG(DATEDIFF(end_date, start_date) + 1) >= 7
)
SELECT
car_id
, ROUND(average_duration, 1) AS average_duration
FROM
temp
ORDER BY
2 DESC
, 1 DESC
;
문제 핵심
(1) 날짜 계산 함수 사용
end_date - start_date
를 하면 원하는 날짜 차이가 나오지 않음 → 두 기간 사이의 일수 계산을 계산해주는 DATEDIFF() 함수를 사용
DATEDIFF(종료날짜, 시작날짜)
날짜 포맷에 시간이 포함되어 있는 경우 시간은 계산에 포함하지 않고, 날짜 범위에서 벗어나는 값을 입력하는 경우 NULL을 반환
(2) DATEDIFF() 결과+ 1
대여한 날에 바로 반납했을 경우(e.g. start_date: '2024-09-09', end_date: '2024-09-09') DATEDIFF(end_date, start_date) 결과는 0이지만 실제로는 오늘 빌려서 오늘 반납할 경우 대여기간을 1로 계산하기 때문에 DATEDIFF() 결과값에 +1을 해 주어야 함
※ 그냥 -를 하면 2022-01-27은 20220127이라는 숫자로 계산이 되어서 실제로는 5일 차이인 2022-02-01이 20220201이라는 숫자로 계산이 되고 20220201 - 20220127 의 결과인 74가 나옴
def solution(n):
for i in range(2, n):
if n%i == 1:
return i
def solution(n):
return next(i for i in range(2, n) if n%i == 1)
iter와 next
- iter
- 객체의 __iter__ 메서드 호출
- 반복을 끝낼 값을 지정하면 특정 값이 나올 때 반복을 끝냄
iter(호출 가능한 객체, 반복을 끝낼 값)
- 반복 가능한 객체 대신 호출 가능한 객체(callable)를 넣어줌
- 반복을 끝낼 값은 sentinel이라고 부름(감시병이라는 뜻→반복을 감시하다가 특정 값이 나오면 반복을 끝냄)
''' random.randint(0, 5)와 같이 0부터 5까지 무작위로 숫자를 생성할 때 2가 나오면 반복을 끝내게 할 수 있음 이때 호출 가능한 객체를 넣어야 하므로 매개변수가 없는 함수 또는 람다 표현식으로 만들어 줘야 함 ''' >> import random >> it = iter(rambda : random.randint(0, 5), 2) >> next(it) 0 >> next(it) 3 >> next(it) 1 >> next(it) Traceback (most recent call last): File "<pyshell#37>", line 1, in <module> next(it) StopIteration
next(it)로 숫자를 계속 만들다가 2가 나오면 StopIteration이 발생
>> import random >> for i in iter(rambda : random.randint(0, 5), 2): print(i, end=" ") # 출력: 3 1 4 0 5 3 3 5 0 4 1 # 숫자가 무작위로 생성되므로 next(it)를 호출하는 횟수도 매번 달라짐 # 아래 코드와 동작이 같음 import random while True: i = random.randint(0, 5) if i == 2: break print(i, end=" ")
- next
- 객체의 __next__ 메서드 호출
next(반복 가능한 객체, 기본값)
- 기본값을 지정하면 반복이 끝나더라도 StopIteration이 발생하지 않고 기본값을 출력
- 반복할 수 있을 때는 해당 값을 출력하고, 반복이 끝났을 때는 기본값을 출력
>> it = iter(range(3)) >> next(it, 10) 0 >> next(it, 10) 1 >> next(it, 10) 2 >> next(it, 10) 10 >> next(it, 10) 10 ''' 0, 1, 2까지 나온 뒤에도 next(it, 10)을 호출하면 예외가 발생하지 않고 계속 10이 나옴 '''
def solution(x, n):
return [x*i for i in range(1, n+1)]
def number_generator(x, n):
return [i * x + x for i in range(n)]
def number_generator(x, n):
y = [x];
for i in range(1,n):
y= y + [x+x*(i)]
return(y)