、私はy
という欄に、そのクエリへの情報の1つの以上のビットを追加し、以下のソリューションでは、あなたの元のスレッドData grouped by date in oracle sql
に提供される解決策に戻って参照してくださいそこで作成された各間隔の年(最も近い整数に丸められた)。私は、あなたの新しい要件のように "年間"の間隔を生成するために、この包みを追加の(外側の)包み込みで使用します。これを行うための標準的な方法は、以下に示すような従来の階層的なクエリを使用する方法です。
select level as yr, employee, job,
add_months(start_date, 12 * (level - 1)) as start_date,
case when level < y then add_months(start_date, 12 * level) - 1
else end_date end as end_date,
FTE
from (
select employee, job, min(start_date) as start_date, max(end_date) as end_date, FTE,
ceil(months_between(max(end_date), min(start_date))/12) as y
from (select employee, job, start_date, end_date, FTE,
row_number() over (partition by employee, job order by start_date) -
row_number() over (partition by employee, job, FTE order by start_date)
as grp
from t
)
group by employee, job, FTE, grp
)
connect by level <= y
and prior employee = employee
and prior start_date = start_date
and prior sys_guid() is not null
order by employee, start_date -- if needed
;
出力:
YR EMPLOYEE JOB START_DATE END_DATE FTE
--- ---------- ----- ----------- ----------- ----------
1 1111 1 19-May-2008 18-May-2009 100
2 1111 1 19-May-2009 18-May-2010 100
3 1111 1 19-May-2010 18-May-2011 100
4 1111 1 19-May-2011 18-May-2012 100
5 1111 1 19-May-2012 18-May-2013 100
6 1111 1 19-May-2013 27-Nov-2013 100
1 1111 1 28-Nov-2013 27-Nov-2014 60
2 1111 1 28-Nov-2014 24-Aug-2015 60
1 1111 1 25-Aug-2015 24-Aug-2016 68.571
2 1111 1 25-Aug-2016 11-Sep-2016 68.571
1 1111 1 12-Sep-2016 29-Sep-2016 72.857
1 1111 1 30-Sep-2016 10-Nov-2016 91.429
1 1111 1 11-Nov-2016 23-Apr-2017 100
1 1111 1 24-Apr-2017 14-Jan-2018 60
1 1111 1 15-Jan-2018 14-Jan-2019 71.429
2 1111 1 15-Jan-2019 31-May-2019 71.429
1 1111 1 01-Jun-2019 31-May-2020 100
2 1111 1 01-Jun-2020 31-May-2021 100
3 1111 1 01-Jun-2021 31-May-2022 100
4 1111 1 01-Jun-2022 31-May-2023 100
5 1111 1 01-Jun-2023 31-May-2024 100
.............................
29 1111 1 01-Jun-2047 31-May-2048 100
30 1111 1 01-Jun-2048 31-May-2049 100
31 1111 1 01-Jun-2049 31-Dec-2049 100
47 rows selected.