Tabibitosan diese Griffe sehr leicht:
WITH your_table AS (SELECT to_date('01/01/2017', 'dd/mm/yyyy') daytime, 20000 VALUE FROM dual UNION ALL
SELECT to_date('02/01/2017', 'dd/mm/yyyy') daytime, 20000 VALUE FROM dual UNION ALL
SELECT to_date('03/01/2017', 'dd/mm/yyyy') daytime, 20000 VALUE FROM dual UNION ALL
SELECT to_date('04/01/2017', 'dd/mm/yyyy') daytime, 35000 VALUE FROM dual UNION ALL
SELECT to_date('05/01/2017', 'dd/mm/yyyy') daytime, 35000 VALUE FROM dual UNION ALL
SELECT to_date('06/01/2017', 'dd/mm/yyyy') daytime, 40000 VALUE FROM dual UNION ALL
SELECT to_date('07/01/2017', 'dd/mm/yyyy') daytime, 40000 VALUE FROM dual UNION ALL
SELECT to_date('08/01/2017', 'dd/mm/yyyy') daytime, 50000 VALUE FROM dual UNION ALL
SELECT to_date('09/01/2017', 'dd/mm/yyyy') daytime, 20000 VALUE FROM dual)
-- end of mimicking your table with data in it. See SQL below:
SELECT MIN(daytime) fromdate,
MAX(daytime) todate,
VALUE
FROM (SELECT daytime,
VALUE,
row_number() OVER (ORDER BY daytime) - row_number() OVER (PARTITION BY VALUE ORDER BY daytime) grp
FROM your_table)
GROUP BY grp,
VALUE
ORDER BY MIN(daytime);
FROMDATE TODATE VALUE
---------- ---------- ----------
01/01/2017 03/01/2017 20000
04/01/2017 05/01/2017 35000
06/01/2017 07/01/2017 40000
08/01/2017 08/01/2017 50000
09/01/2017 09/01/2017 20000
Was das bedeutet ist die Zeilennummer für alle nach Datum geordnet Reihen vergleichen und dann die Zeilennummer für alle Zeilen für jeden nach Datum sortierten Wert. Wenn die Wertezeilen im Hauptdatensatz fortlaufend sind, bleibt der Unterschied zwischen den beiden Datensätzen derselbe, so dass Sie anschließend eine Gruppierung vornehmen können. Wenn es eine Lücke gibt, dann erhöht sich der Unterschied.
In Ihrem Beispiel oben sind die ersten drei Zeilen für Wert = 20000 die ersten drei Zeilen des gesamten Satzes, also ist die Differenz 0. Der vierte Wert = 20000 Zeile ist jedoch die 9. Zeile im Ganzen gesetzt, so dass der Unterschied jetzt 5 ist. Sie können leicht sehen, dass der Wert von 20000 in zwei Gruppen fällt, und als solche können Sie die Min/Max-Tage für jede Gruppe separat finden, indem Sie diese Differenzberechnung in die Gruppenklausel aufnehmen.
N.B. Dies setzt voraus, dass die Daten in Ihren Daten fortlaufend sind oder dass bei fehlenden Daten davon ausgegangen wird, dass der Wert für die fehlenden Daten gleich bleibt. Wenn Tage fehlen und die Werte in einer Lücke in verschiedenen Gruppen angezeigt werden sollen, müssen Sie eine externe Verknüpfung mit einer Unterabfrage erstellen, die die fehlenden Daten enthält. In diesem Fall denke ich, dass die Antwort von GurV (mit der Zusatzklausel in der Fallbeschreibung, die ich in den Kommentaren erwähnt habe) die beste wäre, da dies die Notwendigkeit vermeidet, sich einer Liste aufeinanderfolgender Daten anzuschließen.
Bingo! Es klappt! Vielen Dank :) – akira
Nicht sicher, wie Sie die N.B. - Vielleicht meinst du, wenn oben zehn Zeilen stehen, alle mit dem Wert 20000, aber die Daten sind vier aufeinanderfolgende Tage, dann eine Lücke und dann sechs weitere aufeinanderfolgende Tage, und das sollte zwei statt einer Zeile ergeben ... Wenn das ist was du meinst, dann kann eine kleine Modifikation von ** Tabibitosan ** direkt damit umgehen.Um 'grp' zu erstellen, verwenden Sie' day' selbst anstelle der ersten 'row_number()'; Auf diese Weise werden die 'grp'-Werte als Daten anstelle von Zahlen angezeigt, aber das Ganze funktioniert genauso. – mathguy
Guter Punkt, ta; Ich hätte nie zuvor daran gedacht! Ich werde am Montag damit spielen. * :-) – Boneist