with deliveries as (
select *
FROM Delivery d1
WHERE order_date = (
SELECT MIN(order_date)
FROM Delivery d2
WHERE d2.customer_id = d1.customer_id
)
)
select round(avg(case when order_date = customer_pref_delivery_date then 1 else 0 end) * 100, 2) as immediate_percentage
from deliveries
;
WITH ranked AS (
SELECT *,
ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY order_date) AS rn
FROM Delivery
)
SELECT ROUND(
AVG(CASE
WHEN order_date = customer_pref_delivery_date THEN 1
ELSE 0
END), 2
) AS immediate_percentage
FROM ranked
WHERE rn = 1;
윈도우 함수 사용한 해답
ROW_NUMBER(): 행 번호 매기기 (여기선 rn이 행 번호)PARTITION BY: 그룹 나누기 (GROUP BY랑 비슷하지만 다름)import java.util.ArrayList;
import java.util.List;
class Solution {
public int solution(int[] ingredient) {
int answer = 0;
List<Integer> workbench = new ArrayList<>();
for (int ing : ingredient) {
workbench.add(ing);
if (workbench.size() >= 4) {
int size = workbench.size();
if (workbench.get(size - 4) == 1
&& workbench.get(size - 3) == 2
&& workbench.get(size - 2) == 3
&& workbench.get(size - 1) == 1) {
answer++;
workbench.remove(size - 1);
workbench.remove(size - 2);
workbench.remove(size - 3);
workbench.remove(size - 4);
}
}
}
return answer;
}
}