[mysql] MySQL Query GROUP BY 일 / 월 / 년

1 년, 월 또는 일과 같이 결정된 기간 동안 TIMESTAMP필드 가있는 레코드 수를 계산하는 간단한 쿼리를 만들 수 있습니까?

SELECT COUNT(id)
FROM stats
WHERE record_date.YEAR = 2009
GROUP BY record_date.YEAR

또는:

SELECT COUNT(id)
FROM stats
GROUP BY record_date.YEAR, record_date.MONTH

월간 통계가 있어야합니다.

감사!



답변

GROUP BY YEAR(record_date), MONTH(record_date)

MySQL 의 날짜 및 시간 기능 을 확인하십시오 .


답변

GROUP BY DATE_FORMAT(record_date, '%Y%m')

참고로 (주로 잠재적 다운 보더에게). 현재 이것은 다른 제안만큼 효율적이지 않을 수 있습니다. 아직도, 나는 그것을 다른 대안으로 남겨두고 다른 솔루션이 얼마나 빠른지 알 수있는 대안으로 남겨 둡니다. (차이점을 볼 때까지 천천히 느리게 알 수 없기 때문에) 시간이 지남에 따라 최적화와 관련하여 MySQL 엔진을 변경 하여이 솔루션을 일부 (아마도 그렇지 않은 경우) 변경할 수 있습니다 먼 미래), 대부분의 다른 사람들과 효율성이 상당히 비슷합니다.


답변

이거 한번 해봐

SELECT COUNT(id)
FROM stats
GROUP BY EXTRACT(YEAR_MONTH FROM record_date)

EXTRACT (단위 FROM 날짜) 함수는 그룹화를 적게 사용하고 숫자 값을 반환하므로 더 좋습니다.

그룹화시 비교 조건은 DATE_FORMAT 함수 (문자열 값을 반환)보다 빠릅니다. SQL 비교 조건 (WHERE, HAVING, ORDER BY, GROUP BY)에 문자열이 아닌 값을 리턴하는 function | field를 사용해보십시오.


답변

위의 ‘WHERE’문을 사용해 보았습니다. 아무도 수정하지 않았지만 잘못되었습니다. 일부 검색 후 나는 이것이 WHERE 문에 대한 올바른 수식이라는 것을 알았으므로 코드는 다음과 같습니다.

SELECT COUNT(id)
FROM stats
WHERE YEAR(record_date) = 2009
GROUP BY MONTH(record_date)


답변

검색 기간이 몇 년이 지났는데도 여전히 월 단위로 그룹화하려면 다음을 제안합니다.

버전 # 1 :

SELECT SQL_NO_CACHE YEAR(record_date), MONTH(record_date), COUNT(*)
FROM stats
GROUP BY DATE_FORMAT(record_date, '%Y%m')

버전 # 2 (보다 효율적) :

SELECT SQL_NO_CACHE YEAR(record_date), MONTH(record_date), COUNT(*)
FROM stats
GROUP BY YEAR(record_date)*100 + MONTH(record_date)

이 버전을 큰 테이블에서 1,357,918 행으로 비교했습니다.), 두 번째 버전의 결과가 더 좋습니다.

version1 (평균 10 회 실행) : 1.404 초
version2 (평균 10 회 실행) : 0.780 초

( SQL_NO_CACHE키가 추가되어 MySQL이 CACHING을 쿼리하지 못하게합니다.)


답변

MySQL에서 날짜별로 그룹화하려면 아래 코드를 사용하십시오.

 SELECT COUNT(id)
 FROM stats
 GROUP BY DAYOFMONTH(record_date)

이 스레드를 찾을 사람들에게 시간이 절약되기를 바랍니다.


답변

특정 연도 (예 : 2000)에 대한 레코드를 필터링하려면 다음 WHERE과 같이 절 을 최적화하십시오 .

SELECT MONTH(date_column), COUNT(*)
FROM date_table
WHERE date_column >= '2000-01-01' AND date_column < '2001-01-01'
GROUP BY MONTH(date_column)
-- average 0.016 sec.

대신에:

WHERE YEAR(date_column) = 2000
-- average 0.132 sec.

결과는 300k 개의 행과 인덱스 날짜 열이 포함 된 테이블에 대해 생성되었습니다.

GROUP BY조항에 관해서 는 위에서 언급 한 표에 대해 세 가지 변형을 테스트했습니다. 결과는 다음과 같습니다.

SELECT YEAR(date_column), MONTH(date_column), COUNT(*)
FROM date_table
GROUP BY YEAR(date_column), MONTH(date_column)
-- codelogic
-- average 0.250 sec.

SELECT YEAR(date_column), MONTH(date_column), COUNT(*)
FROM date_table
GROUP BY DATE_FORMAT(date_column, '%Y%m')
-- Andriy M
-- average 0.468 sec.

SELECT YEAR(date_column), MONTH(date_column), COUNT(*)
FROM date_table
GROUP BY EXTRACT(YEAR_MONTH FROM date_column)
-- fu-chi
-- average 0.203 sec.

마지막이 승자입니다.