복붙노트

[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. ==============================

    1.

    GROUP BY YEAR(record_date), MONTH(record_date)
    

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

  2. ==============================

    2.

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

    주 (주로, 잠재적 downvoters에). 현재, 이것은 다른 제안으로 효율적하지 않을 수 있습니다. 그럼에도 불구하고, 나는 빨리 다른 솔루션이 얼마나보고에서 봉사 할 수있는, 너무 다른, 그리고 한로 둡니다. 시간이 지남에 따라이 솔루션을 만들 수 있도록 (당신은 차이를 볼 때까지 정말 빠른 속도가 느린에서 말할 수 없다 들어.) 또한, 변화는 일부 (아마도 그리에서 최적화와 관련하여 MySQL의의 엔진을 만들 수있는 미래의 먼) 점은, 대부분의 다른 사람들과 효율성이 상당히 비교가 될 수 있습니다.

  3. ==============================

    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. ==============================

    4.나는 아무도 그것을 수정 없지만 내가 잘못 때부터이 올바른 생각, 위의 'WHERE'문을 사용하여 시도; 일부 검색 후 나는 코드는 다음과 같이 될 수 있도록이가 WHERE 문에 대한 올바른 공식 것을 발견 :

    나는 아무도 그것을 수정 없지만 내가 잘못 때부터이 올바른 생각, 위의 'WHERE'문을 사용하여 시도; 일부 검색 후 나는 코드는 다음과 같이 될 수 있도록이가 WHERE 문에 대한 올바른 공식 것을 발견 :

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

    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. ==============================

    6.당신은 MySQL은 날짜별로 그룹화 할 경우 코드 아래를 사용합니다 :

    당신은 MySQL은 날짜별로 그룹화 할 경우 코드 아래를 사용합니다 :

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

    문제는이 스레드를 발견하고자하는 사람을위한 시간을 절약 할 수 있기를 바랍니다.

  7. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    13..... TO_CHAR (날짜, 'YYYY')에 의해 그룹 -> 1989

    .... TO_CHAR (날짜, 'YYYY')에 의해 그룹 -> 1989

    .... 그룹 TO_CHAR에 의해 (날짜, 'MM') -> 05

    .... 그룹 TO_CHAR에 의해 (날짜, 'DD') ---> (23)

    .... 그룹 TO_CHAR에 의해 (날짜, 'MON') ---> 월

    .... 그룹 TO_CHAR (날짜, 'YY')에 의해 ---> 89

  14. from https://stackoverflow.com/questions/508791/mysql-query-group-by-day-month-year by cc-by-sa and MIT license