data - запрос на создание некоторых тестовых данных вместо создания таблицы с тестовыми данными.
before_query - извлекает максимальную дату <= 2011-03-31 для каждого идентификатора клиента </p>
after_query - извлекает минимальную дату> = 2011-04-01 для каждого идентификатора клиента
Кроме моей фиктивной таблицы Oracle dual
(которую я использовал для генерации некоторых тестовых данных), я считаю, что я использовал только стандартный синтаксис SQL.
Вам не нужно будет генерировать данные, чтобы можно было пропустить часть их запроса.Везде, где на запрос ссылается data
, замените его на table name
.
with
data as (select 2 as id, '2011-01-04' as trans_date, 55.66 as value from dual
union all
select 2 as id, '2011-03-23' as trans_date, 22.33 as value from dual
union all
select 2 as id, '2011-04-21' as trans_date, 9.44 as value from dual
union all
select 5 as id, '2010-01-04' as trans_date, 104.55 as value from dual
union all
select 5 as id, '2011-02-03' as trans_date, 38.82 as value from dual),
before_qry as (select id, max(trans_date) as max_date from data
where trans_date <= '2011-03-31'
group by id),
after_qry as (select id, min(trans_date) as min_date from data
where trans_date >= '2011-04-01'
group by id)
select bq.*, bq_d.value, aq.*, aq_d.value
from before_qry bq inner join after_qry aq on bq.id = aq.id
inner join data bq_d on bq.id = bq_d.id and bq.max_date = bq_d.trans_date
inner join data aq_d on aq.id=aq_d.id and aq.min_date = aq_d.trans_date
. Для тестовых данных, показанных в вашем вопросе, этот запрос дает следующие результаты
ID MAX_DATE VALUE ID MIN_DATE VALUE
---------- ---------- ---------- ---------- ---------- ----------
2 2011-03-23 22.33 2 2011-04-21 9.44