Рассмотрим MATCH_RECOGNIZE
.
Есть много способов SQL сделать это, некоторые хорошие уже даны. Вот тот, который ( очень возможно) более читабелен, когда вы освоитесь с синтаксисом.
Вы ищете строки в ваших данных, которые соответствуют шаблону. В частности, за строкой до 01.03.2014 или после нее следует сразу же за строкой от 01.03.2009, между которой ничего нет.
Каждый раз, когда вы ищете строки, соответствующие шаблону, вы можете использоватьпредложение MATCH_RECOGNIZE
в вашем SELECT
. Вот ваш случай:
SELECT id from mytable
MATCH_RECOGNIZE (
PARTITION BY id
ONE ROW PER MATCH
PATTERN ( OLDER RECENT )
DEFINE
RECENT AS RECENT.dte = TO_DATE('3/1/2019','MM/DD/YYYY'),
OLDER AS OLDER.dte <= TO_DATE('3/1/2014','MM/DD/YYYY')
)
+----+
| ID |
+----+
| 2 |
+----+
Это хорошо, потому что вы можете изменить его, чтобы получить больше информации, не внося слишком много изменений в общий подход.
Например, предположим, что вы также хотели знать, для каждого id
, какова была дата выпадения серии. (То есть, это была последняя дата или до 01.03.2014, для которой были данные). Это подходит только с небольшими изменениями:
SELECT id, dropoff_date from mytable
MATCH_RECOGNIZE (
PARTITION BY id
MEASURES OLDER.dte AS dropoff_date
ONE ROW PER MATCH
PATTERN ( OLDER RECENT )
DEFINE
RECENT AS RECENT.dte = TO_DATE('3/1/2019','MM/DD/YYYY'),
OLDER AS OLDER.dte <= TO_DATE('3/1/2014','MM/DD/YYYY')
)
+----+--------------+
| ID | DROPOFF_DATE |
+----+--------------+
| 2 | 01-MAR-14 |
+----+--------------+