2013-05-20 1 views
0

я в настоящее время есть запрос, который возвращает, например, следующее: (Вы можете предположить, что это то, что структура таблицы выглядит)Избавиться от «полу-дублей» в запросе

customer_id | start_date | end_date 
1   | 20120101 | 20120401 
2   | 20120402 | 20121231 
1   | 20130101 | 20130401 
1   | 20130101 | 20130330 
2   | 20130331 | 99991231 
2   | 20130402 | 99991231 

Там в два момента для рассмотрения:

  1. Клиент может вернуться, поэтому нормальный макс/мин на этом не работает.
  2. Это на самом деле обзор нескольких сервисов, и иногда один из них начинается или заканчивается в другую дату. (Очень редко, но мне нужно, чтобы иметь дело с этим сценарием.)

Так принимая во внимание вышесказанное, я хочу запрос, который будет возвращать 1-й, 2-й, 3-й, и 5-й линии.

Моя идея & подход к этому будет:

  • Если start_dates равны, отображение макс даты окончания. (group by customer_id & start_date, max (end_date))
  • Если end_dates равны, отобразите минимальную дату начала. (Группа по customer_id & датой_окончания, мин (start_date))

я могу написать запрос, который будет делать один из перечисленных выше, но я не знаю, как я смог бы идти об этом оба в то же время. Или, если бы совсем другой подход был бы лучше.

SQL Server 2008

Спасибо!

+0

. , Какой у Вас вопрос? Это как реализовать свои два пулевых пункта? Или это хороший подход? Для последнего вам действительно не хватает информации. –

+0

Вы пытаетесь объединить перекрывающиеся диапазоны дат? (Нумерация строк вашего примера будет приятным жестом, так как вы ссылаетесь на них по номеру в тексте.) – HABO

+0

Теперь мой вопрос выделен полужирным. Мне нужен запрос, который сможет это сделать. Я предложил некоторые мысли и идеи, которые пришли мне на ум, потому что я думал, что это будет полезно. Ответ не обязательно должен следовать им. – Julian

ответ

0

Я думаю, что вы можете сделать это с not exists условия -

следующего запроса вы можете использовать для этого выхода -

select customer_id , start_date , end_date 
from table_name t_1 
where not exists(
    select 1 from table_name t_2 
    where t_2.customer_id = t_1.customer_id 
    and t_2.start_date = t_1.start_date 
    and t_2.end_date > t_1.end_date) 
and not exists (
    select 1 from table_name t_3 
    where t_3.customer_id = t_1.customer_id 
    and t_3.end_date = t_1.end_date 
    and t_3.start_date<t_1.start_date) 
+0

't_2.start_date = t_2.start_date'? – HABO

+0

oops My bad .. Я исправлю это. Спасибо @HABO –

+0

Спасибо, это соответствует моим ограничениям, но я думаю, что я пойду с более широким решением, указанным в дубликатной ссылке. – Julian

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