2014-12-09 4 views
0

У меня есть случай, когда я должен найти дату начала и дату окончания ПродуктаОпределить дату начала и Дату окончания из списка дней сделки продукта в SQL

У меня есть таблица, как показано ниже,

Product Country  Attribute_1  Attribute_2  Attribute_3  Transaction_date 
ABC   US   Color   Green   Small   20130101 
ABC   US   Color   Green   Small   20130102 
ABC   US   Color   Green   Small   20130103 
ABC   US   Color   Green   Small   20130104 
ABC   US   Color   Green   Small   20130105 
ABC   US   Color   Red    Big    20130201 
ABC   US   Color   Red    Big    20130202 
ABC   US   Color   Red    Big    20130203 
ABC   US   Color   Red    Big    20130204 
ABC   US   Color   Red    Big    20130205 
ABC   US   Color   Green   Small   20130301 
ABC   US   Color   Green   Small   20130302 
ABC   US   Color   Green   Small   20130303 
ABC   US   Color   Green   Small   20140101 

Выход должен быть,

Product Country  Attribute_1  Attribute_2  Attribute_3  Start_Date  End_Date 
ABC   US   Color   Green   Small   20130101  20130201 
ABC   US   Color   Red    Big    20130201     20130301 
ABC   US   Color   Green   Small   20130301  99999999 

Здесь уникальный ключ продукта + СТРАНА

Я пытался M IN, MAX и FIRST_VALUE и LAST_VALUE, как показано ниже, но не в состоянии получить желаемый результат.

FIRST_VALUE(Transaction_date) OVER (PARTITION BY PRODUCT, COUNTRY OVER Attrubute1, Attribute_2, Attribute_3 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)

опробовали Min, Max и GroupBy, это не дает желаемого результата. Выходной сигнал

Product  Country  Attribute_1  Attribute_2  Attribute_3  Start_Date  End_Date 
ABC   US   Color   Green   Small   20130101  20140101 
ABC   US   Color   Red    Big    20130201  20130205 

В этом случае, если я передам дату 20130204, я получу две записи. В идеале я должен получить только вторую запись.

Может кто-то, пожалуйста, помогите мне получить желаемый результат.

+0

Какая СУБД вы используете? Postgres? Oracle? –

+0

Я использую Postgres, даже Oracle будет работать. У меня есть данные в обоих, и я предпочитаю код в Postgres. Спасибо –

ответ

0

Использование

lag(coalesce(Attribute_1,'')||'|' 
    ||coalesce(Attribute_1,'')||'|' 
    ||coalesce(Attribute_1,'')) as la 
over (partition by Product, Country order by Transaction_date) 

получить атрибуты предыдущего ряда.

Отфильтровать все строки, которые имеют одинаковые атрибуты для текущих и предыдущих строк. Это даст вам 3 строки, как в желаемом выходе.

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

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