2016-06-22 4 views
-2
|Resource ID | Start Date | End Date| 
------------------------------------- 
|24565865 | 04-01-16 | 29-01-16| 
|24565865 | 29-01-16 | 01-02-16|  
|24565865 | 01-02-16 | 25-03-16| 
|24565865 | 25-03-16 | 01-04-16| 
|24565865 | 01-04-16 | 09-05-16| 
|24565865 | 09-05-16 | 13-05-16| 
|24565865 | 13-05-16 | 25-07-16| 
|24565865 | 25-07-16 | 01-08-16| 
|24565865 | 01-08-16 | 12-12-99| 

хочет отобразить эти даты какMerge Даты в непрерывные даты

|Resource ID | Start Date | End Date| 
------------------------------------- 
|24565865 |04-01-2016 |25-03-2016| 
|24565865 |01-04-2016 |12-12-2099| 

.

SELECT 
    o.asset_id,o.path,RB.RESOURCE_ID,rl.start_date,rl.end_date 
    ,o.resourcemanager_id,rl.resourcemanager_id 
FROM 
    objectbase o 
JOIN 
    resourcelock rl 
ON 
    o.resourcemanager_id=rl.resourcemanager_id 
JOIN 
    resourcebase rb 
ON 
    rb.resource_id=O.ASSET_ID 
WHERE 
    RB.RESOURCE_ID=24565865 AND O.CODE LIKE '186' 
ORDER BY 
    RL.START_DATE; 

выше запрос

+0

Что есть вы уже пробовали? Что именно вы застряли? Какова ваша логика здесь, почему группировка, которую вы показали? –

+0

это дата начала и окончания, и я хочу показать клиенту только одну начальную и конечную дату для непрерывного периода –

+2

начало и конец даты чего? эти данные являются непрерывным списком дат, там нет пробелов. Я предлагаю вам отредактировать вопрос, чтобы дать нам гораздо больше информации, здесь нет ничего, чтобы работать здесь. –

ответ

0

Вы можете использовать комбинацию LAG(), LEAD() и LAST_VALUE() аналитических функций:

SELECT * 
FROM (
    SELECT resource_id, 
     CASE 
     WHEN end_date IS NOT NULL 
     THEN LAST_VALUE(start_date) IGNORE NULLS 
       OVER(PARTITION BY resource_id ORDER BY ROWNUM) 
     END AS start_date, 
     end_date 
    FROM (
    SELECT resource_id, 
      CASE start_date 
      WHEN LAG(end_date) 
        OVER (PARTITION BY resource_id ORDER BY end_date) 
      THEN NULL 
      ELSE start_date 
      END AS start_date, 
      CASE end_date 
      WHEN LEAD(start_date) 
        OVER (PARTITION BY resource_id ORDER BY end_date) 
      THEN NULL 
      ELSE end_date 
      END AS end_date 
    FROM (
     -- your query 
    ) 
) 
) 
WHERE start_date IS NOT NULL 
AND end_date IS NOT NULL 
0

Вот альтернативный способ:

with sample_data as (select 24565865 resource_id, to_date('04/01/2016', 'dd/mm/yyyy') start_date, to_date('29/01/2016', 'dd/mm/yyyy') end_date from dual union all 
        select 24565865 resource_id, to_date('29/01/2016', 'dd/mm/yyyy') start_date, to_date('01/02/2016', 'dd/mm/yyyy') end_date from dual union all 
        select 24565865 resource_id, to_date('01/02/2016', 'dd/mm/yyyy') start_date, to_date('25/03/2016', 'dd/mm/yyyy') end_date from dual union all 
--      select 24565865 resource_id, to_date('25/03/2016', 'dd/mm/yyyy') start_date, to_date('01/04/2016', 'dd/mm/yyyy') end_date from dual union all 
        select 24565865 resource_id, to_date('01/04/2016', 'dd/mm/yyyy') start_date, to_date('09/05/2016', 'dd/mm/yyyy') end_date from dual union all 
        select 24565865 resource_id, to_date('09/05/2016', 'dd/mm/yyyy') start_date, to_date('13/05/2016', 'dd/mm/yyyy') end_date from dual union all 
        select 24565865 resource_id, to_date('13/05/2016', 'dd/mm/yyyy') start_date, to_date('25/07/2016', 'dd/mm/yyyy') end_date from dual union all 
        select 24565865 resource_id, to_date('25/07/2016', 'dd/mm/yyyy') start_date, to_date('01/08/2016', 'dd/mm/yyyy') end_date from dual union all 
        select 24565865 resource_id, to_date('01/08/2016', 'dd/mm/yyyy') start_date, to_date('12/12/2099', 'dd/mm/yyyy') end_date from dual) 
select resource_id, 
     min(start_date) start_date, 
     max(end_date) end_date 
from  (select resource_id, 
       start_date, 
       end_date, 
       sum(sum_col) over (partition by resource_id order by start_date) grp 
      from (select resource_id, 
         start_date, 
         end_date, 
         case when lag(end_date, 1, start_date-1) over (partition by resource_id order by start_date) != start_date then 1 else 0 end sum_col 
        from sample_data)) 
group by resource_id, 
     grp; 

RESOURCE_ID START_DATE END_DATE 
----------- ---------- ---------- 
    24565865 04-01-2016 25-03-2016 
    24565865 01-04-2016 12-12-2099 
Смежные вопросы