복붙노트

[SQL] 어떻게 MySQL의 날짜 격차를 채우기 위해?

SQL

어떻게 MySQL의 날짜 격차를 채우기 위해?

내가 어떻게 MySQL의 날짜 간격을 채울 수 있습니까? 여기 내 쿼리는 다음과 같습니다

SELECT DATE(posted_at) AS date,
    COUNT(*) AS total,
    SUM(attitude = 'positive') AS positive,
    SUM(attitude = 'neutral') AS neutral,
    SUM(attitude = 'negative') AS negative
    FROM `messages`
    WHERE (`messages`.brand_id = 1)
    AND (`messages`.`spam` = 0
    AND `messages`.`duplicate` = 0
    AND `messages`.`ignore` = 0)
    GROUP BY date ORDER BY date

그것은 적절한 결과 집합을 반환 -하지만 난 날짜가 제로에 의해 시작과 끝 사이의 간격을 채우려. 나는이 어떻게 할 수 있습니까?

해결법

  1. ==============================

    1.당신은 도우미 테이블을 만들고 끝으로, 그럼 그냥 LEFT 해당 테이블에 가입 처음부터 모든 날짜와 함께 작성해야합니다 :

    당신은 도우미 테이블을 만들고 끝으로, 그럼 그냥 LEFT 해당 테이블에 가입 처음부터 모든 날짜와 함께 작성해야합니다 :

    SELECT  d.dt AS date,
            COUNT(*) AS total,
            SUM(attitude = 'positive') AS positive,
            SUM(attitude = 'neutral') AS neutral,
            SUM(attitude = 'negative') AS negative
    FROM    dates d
    LEFT JOIN
            messages m
    ON      m.posted_at >= d.dt
            AND m.posted_at < d.dt + INTERVAL 1 DAYS
            AND spam = 0
            AND duplicate = 0
            AND ignore = 0
    GROUP BY
            d.dt
    ORDER BY
            d.dt
    

    기본적으로, 당신이 여기에서 필요로하는 것은 더미 행 원본입니다.

    MySQL은 그것을 생성하는 방법을 결여 유일하게 중요한 시스템이다.

    PostgreSQL는 오라클과 SQL 서버 (따라서, CONNECT BY 재귀 CTE를) 재귀를 사용할 수 있지만, 그렇게 할 수있는 특수 기능 generate_series을 구현합니다.

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

    2.나는 MySQL은 다음과 같은 / 비슷한 구문을 지원할지 모른다; 하지 않을 경우 그러나, 당신은 단지 작성하고 임시 테이블을 삭제할 수 있습니다.

    나는 MySQL은 다음과 같은 / 비슷한 구문을 지원할지 모른다; 하지 않을 경우 그러나, 당신은 단지 작성하고 임시 테이블을 삭제할 수 있습니다.

    --Inputs
    declare @FromDate datetime, /*Inclusive*/
            @ToDate datetime    /*Inclusive*/
    set @FromDate = '20091101'
    set @ToDate = '20091130'
    
    --Query
    declare @Dates table (
        DateValue datetime NOT NULL
    )
    set NOCOUNT ON
    while @FromDate <= @ToDate /*Inclusive*/
    begin
      insert into @Dates(DateValue) values(@FromDate)
      set @FromDate = @FromDate + 1
    end
    set NOCOUNT OFF
    
    select  dates.DateValue,
            Col1...
    from    @Dates dates
            left outer join SourceTableOrView data on
                data.DateValue >= dates.DateValue
            and data.DateValue < dates.DateValue + 1 /*NB: Exclusive*/
    where   ...?
    
  3. from https://stackoverflow.com/questions/1877874/how-to-fill-date-gaps-in-mysql by cc-by-sa and MIT license