[SQL] 일 / 월 / 년 BY MySQL의 쿼리 GROUP
SQL일 / 월 / 년 BY MySQL의 쿼리 GROUP
그것은 내가 좋아하는, 타임 스탬프 필드를 가지고, 년, 월, 일 같은 시간에 정해진 기간에 내가 얼마나 많은 레코드를 계산하는 간단한 쿼리를 만들 수 있습니다 :
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
월별 통계를합니다.
감사!
해결법
-
==============================
1.
GROUP BY YEAR(record_date), MONTH(record_date)
MySQL의 날짜 및 시간 기능을 확인하십시오.
-
==============================
2.
GROUP BY DATE_FORMAT(record_date, '%Y%m')
주 (주로, 잠재적 downvoters에). 현재, 이것은 다른 제안으로 효율적하지 않을 수 있습니다. 그럼에도 불구하고, 나는 빨리 다른 솔루션이 얼마나보고에서 봉사 할 수있는, 너무 다른, 그리고 한로 둡니다. 시간이 지남에 따라이 솔루션을 만들 수 있도록 (당신은 차이를 볼 때까지 정말 빠른 속도가 느린에서 말할 수 없다 들어.) 또한, 변화는 일부 (아마도 그리에서 최적화와 관련하여 MySQL의의 엔진을 만들 수있는 미래의 먼) 점은, 대부분의 다른 사람들과 효율성이 상당히 비교가 될 수 있습니다.
-
==============================
3.이걸로 해봐
이걸로 해봐
SELECT COUNT(id) FROM stats GROUP BY EXTRACT(YEAR_MONTH FROM record_date)
이하 그룹핑 사용하는 기능은 숫자 값을 반환 될 때 EXTRACT 단위 (날짜) 함수는 더 좋다.
빠른 (문자열 값을 반환) DATE_FORMAT 함수보다 것이다 그룹화 비교 조건. 기능을 사용해보십시오 | 필드를 그 SQL 비교 조건에 대한 반환 문자열이 아닌 값 (WHERE, HAVING, ORDER BY, GROUP BY).
-
==============================
4.나는 아무도 그것을 수정 없지만 내가 잘못 때부터이 올바른 생각, 위의 'WHERE'문을 사용하여 시도; 일부 검색 후 나는 코드는 다음과 같이 될 수 있도록이가 WHERE 문에 대한 올바른 공식 것을 발견 :
나는 아무도 그것을 수정 없지만 내가 잘못 때부터이 올바른 생각, 위의 'WHERE'문을 사용하여 시도; 일부 검색 후 나는 코드는 다음과 같이 될 수 있도록이가 WHERE 문에 대한 올바른 공식 것을 발견 :
SELECT COUNT(id) FROM stats WHERE YEAR(record_date) = 2009 GROUP BY MONTH(record_date)
-
==============================
5.검색은 몇 년 동안, 당신은 여전히 매달 그룹화 할 경우에, 나는 제안한다 :
검색은 몇 년 동안, 당신은 여전히 매달 그룹화 할 경우에, 나는 제안한다 :
버전 # 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 행 (이노)와 큰 테이블에이 버전을 비교 그리고 두번째 버전이 나타납니다 더 나은 결과를 얻을 수 있습니다.
버전 1 (10가 실행 평균) : 1.404 초 버전 2 (10가 실행 평균) : 0.780 초
(SQL_NO_CACHE 키를 쿼리 캐싱 방지 MySQL을에 추가됩니다.)
-
==============================
6.당신은 MySQL은 날짜별로 그룹화 할 경우 코드 아래를 사용합니다 :
당신은 MySQL은 날짜별로 그룹화 할 경우 코드 아래를 사용합니다 :
SELECT COUNT(id) FROM stats GROUP BY DAYOFMONTH(record_date)
문제는이 스레드를 발견하고자하는 사람을위한 시간을 절약 할 수 있기를 바랍니다.
-
==============================
7.당신이 (예를 들어, 2000) 특정 연도에 대한 필터를 기록하려면 다음과 같이 WHERE 절을 최적화 :
당신이 (예를 들어, 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.
마지막 하나는 승자입니다.
-
==============================
8.유사 아직 짧고 더 유연한 대안 현재 활성화 된 수행 완료 및 간단한 해결책 :
유사 아직 짧고 더 유연한 대안 현재 활성화 된 수행 완료 및 간단한 해결책 :
SELECT COUNT(*) FROM stats -- GROUP BY YEAR(record_date), MONTH(record_date), DAYOFMONTH(record_date) GROUP BY DATE_FORMAT(record_date, '%Y-%m-%d')
-
==============================
9.당신이 최신 월별로 정렬 매년 한달 행 수와 월별 통계를 얻고 싶은 경우에, 다음이 시도 :
당신이 최신 월별로 정렬 매년 한달 행 수와 월별 통계를 얻고 싶은 경우에, 다음이 시도 :
SELECT count(id), YEAR(record_date), MONTH(record_date) FROM `table` GROUP BY YEAR(record_date), MONTH(record_date) ORDER BY YEAR(record_date) DESC, MONTH(record_date) DESC
-
==============================
10.당신은 GROUP BY에서이 단순히 MySQL의 DATE_FORMAT () 함수를 할 수 있습니다. 당신은 당신이 사용자 정의 할 수 있습니다 다른 years.Here 많은 옵션에서 발생 그러한 기록 후 같은 달 몇 년에 걸쳐 곳으로 경우에 따라 추가 명확성을 위해 여분의 열을 추가 할 수 있습니다. 시작을 befor이 읽어 보시기 바랍니다. 당신을 위해 매우 도움이 될해야 바랍니다. 여기에 귀하의 이해에 대한 샘플 쿼리입니다
당신은 GROUP BY에서이 단순히 MySQL의 DATE_FORMAT () 함수를 할 수 있습니다. 당신은 당신이 사용자 정의 할 수 있습니다 다른 years.Here 많은 옵션에서 발생 그러한 기록 후 같은 달 몇 년에 걸쳐 곳으로 경우에 따라 추가 명확성을 위해 여분의 열을 추가 할 수 있습니다. 시작을 befor이 읽어 보시기 바랍니다. 당신을 위해 매우 도움이 될해야 바랍니다. 여기에 귀하의 이해에 대한 샘플 쿼리입니다
SELECT COUNT(id), DATE_FORMAT(record_date, '%Y-%m-%d') AS DAY, DATE_FORMAT(record_date, '%Y-%m') AS MONTH, DATE_FORMAT(record_date, '%Y') AS YEAR, FROM stats WHERE YEAR = 2009 GROUP BY DATE_FORMAT(record_date, '%Y-%m-%d ');
-
==============================
11.오라클 데이터베이스 12C 출시 12.1.0.1.0에 나를 위해 일한 다음 쿼리
오라클 데이터베이스 12C 출시 12.1.0.1.0에 나를 위해 일한 다음 쿼리
SELECT COUNT(*) FROM stats GROUP BY extract(MONTH FROM TIMESTAMP), extract(MONTH FROM TIMESTAMP), extract(YEAR FROM TIMESTAMP);
-
==============================
12.나는과 같이 1 년 그룹 선택을 최적화하는 것을 선호합니다 :
나는과 같이 1 년 그룹 선택을 최적화하는 것을 선호합니다 :
SELECT COUNT(*) FROM stats WHERE record_date >= :year AND record_date < :year + INTERVAL 1 YEAR;
이 방법으로 할 수 있습니다 단지 년 바인드 한 번에, 예를 들어, '2009', 명명 된 매개 변수와 '-01-01'추가하거나 별도로 '2010'전달에 대해 걱정할 필요가 없습니다.
또한, 같은 아마도 우리가 계산 된 행과 ID는 내가 (ID)를 COUNT하는 COUNT (*)를 선호 NULL 적이 없다.
-
==============================
13..... TO_CHAR (날짜, 'YYYY')에 의해 그룹 -> 1989
.... TO_CHAR (날짜, 'YYYY')에 의해 그룹 -> 1989
.... 그룹 TO_CHAR에 의해 (날짜, 'MM') -> 05
.... 그룹 TO_CHAR에 의해 (날짜, 'DD') ---> (23)
.... 그룹 TO_CHAR에 의해 (날짜, 'MON') ---> 월
.... 그룹 TO_CHAR (날짜, 'YY')에 의해 ---> 89
from https://stackoverflow.com/questions/508791/mysql-query-group-by-day-month-year by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 열 이름 피벗 해제 (0) | 2020.03.11 |
---|---|
[SQL] LINQ 도구에 SQL이 [마감] (0) | 2020.03.11 |
[SQL] 어떻게 PostgreSQL을에 삽입 성능을 향상하기 (0) | 2020.03.11 |
[SQL] 어떻게 MySQL 데이터베이스 / 테이블 / 열이 설정 어떤 문자 볼 수 있습니까? (0) | 2020.03.11 |
[SQL] 내가 교차 사용에 적용해야 할 때 내부 조인? (0) | 2020.03.11 |