2015-11-27 3 views
2

Я пытаюсь создать фрагмент кода для использования предложения, зависящего от контекста.Свернуть исторические строки по статусу в SQL с помощью группы

Так что у меня есть что-то вроде Table1

Customer Status Date_FROM Date_TO 
A  1  1.11.15 2.11.1 
A  1  2.11.15 3.11.15 
...  ... ...  ... 
A  2  5.11.15 6.11.15 
...  ... ...  ... 
A  1  15.11.15 20.11.15 
A  2  20.11.15 27.11.15 

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

select Customer, Status, min(Date_FROM), max(Date_TO) 
    from Table1 
    group by Customer, Status 

Но что я хочу в более сложном сценарии

Table2

Customer Status Date_FROM Date_TO 
A  1  1.11.15 5.11.15 
A  2  5.11.15 15.11.15 
A  1  15.11.15 20.11.15 
A  2  20.11.15 27.11.15 

Есть ли какая-то аналитической sql-функции, которая выполняет совокупность, пока статус (упорядоченный по Date_FROM) не изменяется?

Привет

Патрик

+0

Мне было приятно, если у вас был [sqlfiddle] (http://sqlfiddle.com) для этого. –

+0

Не знаете, на что именно вы нацелены, но «lag» может представлять интерес (сопоставление записи 'n' с' n-1' в заданном порядке, позволяющее идентифицировать, когда происходит изменение состояния), а также 'listagg' который объединяет значения столбца по всем строкам в наборе результатов, чтобы вы могли проверить, изменилась ли последовательность значений состояния. – collapsar

+0

Возможно, вы можете использовать подзапрос с 'lag', который будет использоваться для отображения« это строка, в которой что-то изменилось », а затем извлечение этих строк с помощью WHERE. – marmarta

ответ

1

Взял бы какие-то шаги, чтобы сделать это и две аналитические функции. Запустите его от внутреннего шага к наружному, чтобы понять, что происходит:

with a as( 
    select Customer, Status, Date_FROM, Date_TO, 
     case when status <> lag(status) over (partition by customer order by date_from) 
     then 1 
     else 0 
     end status_switch 
    from table), 
b as(
select 
    Customer, 
    Status, 
    Date_FROM, 
    Date_TO, 
    sum(status_switch) over (partition by customer order by status_switch) as new_status_seq 
from a 
) 
select customer, status, min(date_from), max(date_to) 
from b 
group by customer, status, new_status_seq; 

Не тестировался, там могут быть некоторые ошибки, но вы получите идею.

+0

Это выглядит интересно, я думаю, я понимаю достаточно, чтобы исправить ошибки (если существует). Я буду тестировать его и делиться результатами. Спасибо –

+0

Я проверил ваше заявление и приспособил его к моей проблеме. Это именно то, что я искал. Большое спасибо! –

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