2012-04-09 13 views
0

Ich habe eine Tabelle mit zwei Datumsspalten. DATE1 ist manchmal NULL und enthält manchmal doppelte Werte. DATE2 ist immer ausgefüllt und eindeutig. Mein Tisch ist nach dem letzten DATE2-Datum sortiert.MySQL datetime Vergleich mit der vorherigen Zeile

Ich möchte eine neue Datumsspalte erstellen, in der DATE1 ausgewählt wird, es sei denn, sein Wert wird von der nächsten Zeile dupliziert oder es ist NULL. In diesem Fall möchte ich den Wert von DATE2 annehmen. Ich brauche auch zwei boolesche Spalten, die mir sagen, wenn eine dieser Bedingungen erfüllt ist. Lassen Sie mich anhand eines Beispiels zeigen, dass es klarer ist.

In der unten stehenden Tabelle Zeile 5 und 6 haben einen Wert von 27. Juli 2011 so würde Ich mag das neue Datum Spalte der Zeile 5 bis 4, August 2011 einzustellen (die DATE2 ist). In Zeile 3 ist der Wert von DATE1 NULL, also möchte ich den Wert von DATE2 annehmen.

Ich habe ein paar innere Select-Anweisungen ausprobiert, aber das kann nicht funktionieren. Irgendwelche Ideen?

Mein Tisch, wie es steht derzeit in der Datenbank: so viel

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 

Danke:

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 

Was ich das Endergebnis erwarten aussehen!

+1

@MattFenwick ich von Abfragen über mehrere Zeilen mit dem Tag in dem Sinne bin mit, nicht spezifisch für jede Art von SQL. Wenn Sie denken, dass es irreführend ist, können Sie ein besseres Tag vorschlagen? – McGarnagle

+1

@MattFenwick guten Ruf, du liest meine Gedanken. – McGarnagle

Antwort

1

Dies kann durch sequentielles Scannen der Tabelle und die Verwendung von MySQL-Variablen behandelt werden. Sie können testen, in ( aktualisiert) SQL-fiddle:

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

Es ist so sehr in der Nähe. Das einzige Problem besteht darin, dass das neu berechnete Datum nicht verwendet wird, wenn geprüft wird, ob die Spalte date2 verwendet werden soll oder nicht. Hier ist ein Beispiel: http://sqlfiddle.com/#!2/5063c/3 Die vierte Zeile sollte am 19. November und nicht am 10. Oktober sein, da die nächste Zeile nach Datum2 sortiert ein Duplikat enthält .... – http203

+0

Ich meinte es sagen, dass "das einzige Problem ist, dass es nicht das alte Datum nimmt, wenn es überprüft ...". Ich hoffe du verstehst was ich meine. – http203

+0

@ http203: Die Abfrage wurde aktualisiert. Nochmal testen. –