sql >> Database teknologi >  >> RDS >> Oracle

Skjul datoposter kun, hvis værdien ikke ændres - Oracle SQL

Dette virker en smule indviklet, så jeg ville være interesseret i forbedringer.

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
/

Med disse testdata:

    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

Jeg forstår dette:

    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

Jeg prøvede også med en emp_id (4000 ), der havde tre sammenhængende datointervaller, og det behandlede det OK - den ydre where klausul får de mellemliggende poster til at forsvinde i det væsentlige. Redigeret for at tilføje :Fungerer nu også med dine yderligere datointervaller for 2000/A , da jeg fik ordnet rækkefølgen i den ydre lead /lag partitioner.

Den indre forespørgsel udtømmer alle undtagen den første startdato og sidste slutdato for en sammenhængende blok, og den ydre forespørgsel bruger en anden runde lead og lag at flette dem til identiske rækker, som er distinct kollapser derefter.

Jeg antager start_date og end_date er DATE felter, ikke VARCHAR2 , og du har NLS_DATE_FORMAT indstillet til MMDDYYYY . Hvis de er gemt som strenge, hvilket er en dårlig idé, skal du bruge to_date() en del steder for at få bestillingen til at fungere ordentligt.



  1. Hvad er forskellene mellem utf8_general_ci og utf8_unicode_ci?

  2. Opdater materialiserede visninger med samtidighed

  3. PHP-tid siden funktionsfejl

  4. hvordan man får en enkelt værdi fra array i codeigniter