2012-03-28 15 views
1

ich eine große Tabelle mit den folgenden Spalten und Beispielwerte haben:finden Wert nächste Datum in der Spalte

ID Ser  Reg Date 
1 12345 001 1/3/2011 
1 12345 001 2/2/2011 
1 12345 002 1/3/2011 
1 12345 002 2/2/2011 
2 23456 001 1/3/2011 
2 23456 001 2/7/2011 
2 23456 001 3/5/2011 

habe ich versucht, diese Abfrage aus einem früheren Post SQL - Wählen Sie Abfrage nächsten Termin - aber nicht bekommen die gewünschte Ergebnisse:

SELECT 
    mytable.id, 
    mytable.date, 
    ( 
     SELECT 
      MIN(mytablemin.date) 
     FROM mytable AS mytablemin 
     WHERE mytablemin.date > mytable.date 
    ) AS NextDate 
FROM mytable 

Dies ist, was ich zu erreichen versuchen:

ID  Ser   Reg  curr_Date prev_Date 
1  12345  001  2/2/2011 1/3/2011 
1  12345  002  2/2/2011 1/3/2011 
2  23456  001  2/7/2011 1/5/2011 
2  23456  001  3/5/2011 2/7/2011 

ich jede schätzen würde Hilfe bei dieser Aufgabe.

+3

Willkommen zu StackOverflow: wenn Sie Code, XML oder Daten samp bekanntgeben les, ** bitte ** markiere diese Zeilen im Texteditor und klicke auf den "code samples" Button ('{}') auf der Editor Toolbar, um ihn schön zu formatieren und zu markieren! –

+2

** Was ** Datenbanksystem und welche Version? ** SQL ** ist nur die Structured Query Language - eine Sprache, die von vielen Datenbanksystemen verwendet wird - SQL ist ** NOT ** ein Datenbankprodukt ... solche Sachen sind sehr oft herstellerspezifisch - also müssen wir wirklich was wissen Datenbanksystem, das Sie verwenden .... –

Antwort

0

Es fehlte eine Bedingung in der korrelierten Unterabfrage, die mytablein-Kopie der Tabelle mytable mit mytable verbindet. Außerdem würden Sie Datensätze eliminieren, die nicht über NextDate verfügen. Dies kann jedoch zu falschen Ergebnissen führen, wenn nur ein Datensatz in der Gruppe (Id, Ser, Reg) vorhanden ist, indem er aus der Ergebnismenge entfernt wird.

select * from 
(
    SELECT 
     mytable.id, 
     mytable.date, 
     ( 
      SELECT 
       MIN(mytablemin.date) 
      FROM mytable AS mytablemin 
      WHERE mytablemin.date > mytable.date 
       and mytablemin.id = mytable.id 
       and mytablemin.Ser = mytable.Ser 
       and mytablemin.Reg = mytable.Reg 
     ) AS NextDate 
    FROM mytable 
) a 
where a.NextDate is not null 

Und hier ist die Version abgeleitete Tabelle mit Aggregation mit:

SELECT 
    mytable.id, 
    mytable.date, 
    mytablemin.minDate 
FROM mytable 
    inner join 
    (
    SELECT mytablemin.id, 
      mytablemin.Ser, 
      mytablemin.Reg, 
      MIN(mytablemin.date) minDate 
    FROM mytable AS mytablemin 
    group by mytablemin.id, 
      mytablemin.Ser, 
      mytablemin.Reg 
    having MIN(mytablemin.date) is not null 
) AS mytablemin 
    on mytablemin.id = mytable.id 
    and mytablemin.Ser = mytable.Ser 
    and mytablemin.Reg = mytable.Reg 
0

, wenn Sie Oracle-Datenbank verwenden (wie Sie nicht erwähnt haben, dann kann ich davon nichts)

dann können Sie verwenden Blei- und Nachlauffunktion/Befehl dafür.

select id,ser, reg, curr_date ,prev_date 
from 
(
select id,ser, reg, ser, date curr_date 
LEAD(date, 1, 0) OVER (PARTITION BY id,ser, reg, curr_date ORDER BY date DESC NULLS LAST) prev_date, 
) 
where prev_date is not null; 
Verwandte Themen