यह थोड़ा जटिल लगता है, इसलिए मुझे सुधारों में दिलचस्पी होगी।
select distinct emp_id,
nvl(x_start_date,
lag(x_start_date)
over (partition by emp_id
order by rn)) as start_date,
nvl(x_end_date,
lead(x_end_date)
over (partition by emp_id
order by rn nulls first))
as end_date,
rating,
department
from (
select emp_id, start_date, end_date, rating, department,
case start_date
when lag(end_date)
over (partition by emp_id, rating, department
order by start_date) then null
else start_date end as x_start_date,
case end_date
when lead(start_date)
over (partition by emp_id, rating, department
order by start_date) then null
else end_date end as x_end_date,
rownum as rn
from table1
)
where x_start_date is not null or x_end_date is not null
order by emp_id, start_date
/
इस परीक्षण डेटा के साथ:
EMP_ID START_DA END_DATE RA DEPARTMENT SALARY
---------- -------- -------- -- -------------------- ----------
2000 01012010 01012011 A HR 9000
2000 01012011 01012012 A HR 10000
2000 01012012 01012013 A+ HR 20000
2000 01012013 01012014 A HR 20000
2000 01012014 12319999 A HR 21000
3000 01012011 01012012 B Operations 50000
3000 01012012 12319999 B Operations 60000
4000 07012011 07012012 B Operations 50000
4000 07012012 07012013 B Operations 50000
4000 07012013 12319999 B Operations 60000
मुझे यह मिलता है:
EMP_ID START_DA END_DATE RA DEPARTMENT
---------- -------- -------- -- --------------------
2000 01012010 01012012 A HR
2000 01012012 01012013 A+ HR
2000 01012013 12319999 A HR
3000 01012011 12319999 B Operations
4000 07012011 12319999 B Operations
मैंने emp_id
. के साथ भी कोशिश की (4000
) जिसमें तीन सन्निहित दिनांक सीमाएँ थीं, और यह उस OK - बाहरी where
से निपटता था क्लॉज मध्यवर्ती प्रविष्टियों को अनिवार्य रूप से गायब कर देता है। जोड़ने के लिए संपादित :अब 2000/A
. के लिए आपकी अतिरिक्त तिथि सीमाओं के साथ भी काम करता है , चूंकि मैंने बाहरी lead
. में क्रम तय किया है /lag
विभाजन।
आंतरिक क्वेरी एक सन्निहित ब्लॉक के लिए पहली प्रारंभ तिथि और अंतिम समाप्ति तिथि को छोड़कर सभी को खाली कर देती है, और बाहरी क्वेरी lead
के दूसरे दौर का उपयोग करती है और lag
उन्हें समान पंक्तियों में मर्ज करने के लिए, जो distinct
फिर ढह जाता है।
मैं मान रहा हूँ start_date
और end_date
DATE
हैं फ़ील्ड, न कि VARCHAR2
, और आपके पास NLS_DATE_FORMAT
है MMDDYYYY
. पर सेट करें . यदि उन्हें स्ट्रिंग्स के रूप में संग्रहीत किया जाता है, जो एक बुरा विचार है, तो आपको to_date()
need की आवश्यकता होगी ऑर्डरिंग कार्य को ठीक से करने के लिए काफी कुछ स्थानों पर।