2016-04-07 2 views
0

У меня есть таблица с именем Acount имеет следующую структуруSQL запрос, чтобы добавить начальную и конечную дату для между двумя рядами на основе ввода

acc_id  name  value phase date 

    1   acc_type trial start t1 
    1   name1  value1 phase1 t2 
    1   acc_type trial end  t3 
    1   name2  value2 phase2 t4 
    1   acc_type trial start t5 
    1   name3  value3 phase2 t6 
    1   name4  value4 phase4 t7 
    1   acc_type trial end  t8 

Таблица сортируется на основе даты

Я хочу состоит в том, чтобы добавить два столбца start_date и end_date и обновить столбец для определенной пары значений фазы start and end, где name - acc_type и value - trial.

Так выход будет выглядеть следующим образом:

acc_id  name  value phase date start_date end_date 

    1   acc_type trial start t1  t1   t3 
    1   name1  value1 phase1 t2  t1   t3 
    1   acc_type trial end  t3  t1   t3 
    1   name2  value2 phase2 t4  
    1   acc_type trial start t5  t5   t8 
    1   name3  value3 phase2 t6  t5   t8 
    1   name4  value4 phase4 t7  t5   t8 
    1   acc_type trial end  t8  t5   t8 

Я использую PostgreSQL.

+0

Является ли ваш acc_id одинаковым? –

ответ

2

Это сложно, потому что вам нужно разделить на начало и конец. Если я предполагаю, что надлежащее упорядочение даты, то вы можете использовать кумулятивный max():

select t.*, 
     max(case when phase = 'start' then date end) over 
      (partition by acc_id order by date) as start_date, 
     max(case when phase = 'end' then date end) over 
      (partition by acc_id order by date) as end_date 
from t; 

EDIT:

Я заметил, что есть ценности «в-между». Это требует более сложной логики. Идея состоит в том, чтобы подсчитать количество запусков и концов сети, и использовать ее для фильтрации:

select t.*, 
     (case when netstartend > 0 or phase in ('start', 'end') 
      then max(case when phase = 'start' then date end) over 
         (partition by acc_id order by date) 
     end) as start_date, 
     (case when netstartend > 0 or phase in ('start', 'end') 
      then max(case when phase = 'end' then date end) over 
         (partition by acc_id order by date) 
     end) as end_date 
from (select t.*, 
      sum(case when phase = 'start' then 1 when phase = 'end' then -1 else 0 end) over 
       (order by date) as netstartend 
     from t 
    ) t; 
+0

результат не подходит. start_date выглядит хорошо, но end_date не подходит по мере необходимости. Благодарю. Вы можете проверить эту ссылку «http://sqlfiddle.com/#!15/36a3b/1» –

+0

Я проверяю ваш отредактированный ответ. Я дам вам знать результаты. Большое спасибо. Выше комментарий был для вашего первого решения. –

+1

Все еще не идет, что ожидается. start_date подходит, но end_date неверен. не могли бы вы посмотреть на это. Благодарю . –

Смежные вопросы