이번 문제는 아무리 풀어도 답이 안 나와 다른 사람들이 푼 문제들을 살펴보았다
WITH RECURSIVE HOURS AS (
SELECT 0 AS HOUR UNION ALL SELECT HOUR + 1
FROM HOURS
WHERE HOUR < 23)
SELECT HOURS.HOUR AS HOUR, COUNT(ANIMAL_ID) AS 'COUNT'
FROM ANIMAL_OUTS RIGHT JOIN HOURS
ON DATE_FORMAT(DATETIME,'%H') = HOURS.HOUR
GROUP BY HOUR
ORDER BY HOUR ASC
이런 코드
SELECT HOUR, COUNT(ANIMAL_ID) AS COUNT
FROM ( SELECT (ROW_NUMBER() OVER () - 1) AS HOUR
FROM ANIMAL_OUTS
LIMIT 24) AS 24HOURS_NUM_TABLE
LEFT JOIN ANIMAL_OUTS ON HOUR = HOUR(DATETIME)
GROUP BY HOUR
ORDER BY HOUR
이런 코드
SET @HOUR := -1;
SELECT (@HOUR := @HOUR+1) AS HOUR,
(
SELECT COUNT(*)
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) = @HOUR) AS COUNT
FROM ANIMAL_OUTS
WHERE @HOUR < 23
이런 코드들이 있었다
여기서 효율적으로 보이는SET이 있는 세번쩨 코드를 사용 해보기로 했다
SET 변수는
SET @변수이름 = 대입값; 또는 SET @변수이름 := 대입값;
SELECT @변수이름 := 대입값;
이렇게 쓸 수 있다고 한다
SET @HOUR := -1 로 해준 이유는
0부터 23까지 결과를 내야 하기 때문에
기본값 1에서 -1을 해줘 0으로 결과를 내야 하기 때문이다
변수 이름을 HOUR로 설정
@HOUR := @ HOUR + 1 은 @HOUR 변수의 현재 값에 1을 더한 값을 할당해 주는 것이다
그러므로 0 부터 순서대로 결과가 나온걸 확인 할 수 있다
이제 시간대별로 입양이 몇 건이 발생했는지 결과를 내야 한다
서브쿼리를 이용하여 결과를 낸다
COUNT 함수를 이용하여 개수를 구하고
WHERE HOUR(DATETIME) = @HOUR 이 코드를 사용하여
변수와 같은 시간대에 몇 건이 있었는지 개수를 구한다
그리고 0~23까지만 결과가 나와야 하기 때문에
WHERE @HOUR < 23로 23까지 결과를 낸다
그렇다면 LIMIT도 사용할 수 있지 않을까? 궁금해졌다
SET @HOUR := -1;
SELECT (@HOUR := @HOUR+1) AS HOUR,
(
SELECT COUNT(DATETIME)
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) = @HOUR) AS COUNT
FROM ANIMAL_OUTS
LIMIT 24
23까지 잘 나오는 걸 확인할 수 있다
그렇다면 최종 결과는?
최종 결과도 잘 나오는 걸 확인할 수 있다
오늘의 느낀점
아직 모르는 것들이 너무 많다
어찌 보면 당연한 게 맞다
하지만 당연한 걸 당연하다고 인정하는 순간 거기까지 밖에 성장하지 못한다
좀 더 노력하고 더 성장해야겠다
'코딩 나도 할 수 있다!!' 카테고리의 다른 글
2024.04.16 (화) HTML 네비게이션 바 (0) | 2024.04.16 |
---|---|
2024.03.27 (수) SQL 같은답 다른풀이 (0) | 2024.03.27 |
2024.03.21 (목) SQL USING (0) | 2024.03.21 |
2024.03.20 (수) SQL ROUND 함수 (1) | 2024.03.20 |
2024.03.19 (화) SQL CONCAT, CONCAT_WS 함수 (feat.SUBSTRING) (1) | 2024.03.19 |