2012-04-09 3 views
0

두 개의 날짜 열이있는 테이블이 있습니다. DATE1은 때때로 NULL이고 때로는 중복 값을 포함합니다. DATE2는 항상 채워지고 고유합니다. 내 표가 최신 DATE2 날짜순으로 정렬됩니다.이전 날짜와의 MySQL datetime 비교

DATE1이 선택 될 새 날짜 열을 만들고 싶습니다. 그 값이 다음 행에서 중복되거나 NULL이 아닌 경우입니다. 이 경우 DATE2 값을 사용하고 싶습니다. 또한 두 조건이 충족 될 때 알려주는 두 개의 부울 열이 필요합니다. 예제를 사용하여보다 명확하게 설명해 드리겠습니다. 아래 표

행,도 5 및도 6은 그래서 로 (DATE2이다) 2011년 8월 4일 행 (5)의 새로운 날짜 열을 설정하려는 값 2011년 7월 27일있다. 3 행에서 DATE1의 값이 NULL이므로 DATE2의 값을 가져 오려고합니다.

내부 선택 문을 몇 개 시도했지만 작동하지 않습니다. 어떤 아이디어?

내 테이블은 현재 데이터베이스에 약자로 : 너무 많은

Row  FINAL_DATE  DATE1_DUPLICATE DATE1_WAS_NULL 
    ---------------------------------------------------------- 
    1  Nov 13, 2011 TRUE    FALSE 
    2  Oct 10, 2011 FALSE    FALSE 
    3  Oct 8, 2011  FALSE    TRUE 
    4  Aug 12, 2011 FALSE    FALSE 
    5  Aug 4, 2011  TRUE    FALSE 
    6  Jul 27, 2011 FALSE    FALSE 
    7  Jul 1, 2011  FALSE    FALSE 
    8  May 24, 2011 FALSE    FALSE 

감사 : 나는 최종 결과를 기대

Row  DATE1   DATE2 
    -------------------------------------- 
    1  Oct 10, 2011 Nov 13, 2011  
    2  Oct 10, 2011 Oct 10, 2011  
    3  NULL   Oct 8, 2011  
    4  Aug 12, 2011 Aug 12, 2011  
    5  Jul 27, 2011 Aug 4, 2011  
    6  Jul 27, 2011 Jul 28, 2011  
    7  Jul 1, 2011  Jul 26, 2011  
    8  May 24, 2011 Jun 13, 2011 

처럼보고!

+1

@MattFenwick. 오해의 소지가 있다고 생각한다면 더 나은 태그를 제안 할 수 있습니까? – McGarnagle

+1

@MattFenwick 좋은 전화, 당신은 내 마음을 읽었습니다. – McGarnagle

답변

1

테이블의 순차적 스캔과 MySQL 변수를 사용하여 처리 할 수 ​​있습니다. 당신은 ( 업데이트) SQL-fiddle에서 테스트 할 수 있습니다 : 나는 SQL의 모든 유형에 국한되지 여러 행을 통해 쿼리의 의미에서 태그를 사용하고

SELECT date2 
    , dd 
    , DATE_FORMAT(dd, '%b %e, %Y') AS final_date 
    , date1_duplicate 
    , date1_was_null 
FROM 
(SELECT date2 
     , COALESCE((date1 = @d OR date1 = @prev), FALSE) 
      AS date1_duplicate 
     , (date1 IS NULL)    AS date1_was_null 
     , @d := CASE WHEN (date1 = @d OR date1 = @prev) 
       THEN date2 
       ELSE COALESCE(date1, date2) 
       END AS dd 
     , @prev := date1 AS pre 
    FROM tableX AS t 
    CROSS JOIN 
     (SELECT @d := DATE('1000-01-01') 
      , @prev := @d 
    ) AS dummy 
    ORDER BY date2 ASC 
) AS tmp 
ORDER BY date2 DESC 
; 
+0

아주 가깝습니다. 유일한 문제는 date2 열을 사용할지 여부를 확인할 때 새로 계산 된 날짜를 사용하지 않는다는 것입니다. 다음은 예제입니다. http://sqlfiddle.com/#!2/5063c/3 네 번째 행은 11 월 19 일이 아니고 10 월 10 일이 아니어야합니다. 다음 행에 date2로 정렬 할 때 중복이 포함되어 있기 때문입니다. – http203

+0

"유일한 문제는 그것이 점검 할 때 이전 날짜가 걸리지 않는다는 것입니다 ...". 나는 당신이 내 뜻을 이해하기를 바랍니다. – http203

+0

@ http203 : 쿼리가 업데이트되었습니다. 다시 테스트하십시오. –