2016-11-18 3 views
0

Я пытаюсь добавить столбец в таблицу, которая показывает дату для каждого идентификатора продаж, когда попадает первая сумма. По сути, мне нужен столбец, который показывает первый месяц для каждого идентификатора, где сумма NOT 0 или Null, и мне нужно, чтобы он расширился для всех записей для этого идентификатора продаж. Я пробовал кучу разных вещей, но я не могу понять, как заставить его учитывать все эти критерии.Добавьте столбец даты минус, основанный на нескольких критериях

Пример набора данных

Sales ID   Date  Amount 
0061600000g0jXOAAY 1-Nov-15 0 
0061600000g0jXOAAY 1-Dec-15 0 
0061600000g0jXOAAY 1-Jan-16 1479.01 
0061600000g0jXOAAY 1-Feb-16 1479.01 
0061600000hSBQVAA4 1-Feb-15 0 
0061600000hSBQVAA4 1-Mar-15 0 
0061600000hSBQVAA4 1-Apr-15 1098.18 
0061600000hSBQVAA4 1-May-15 2890 

Желаемая Набор данных

Sales ID   Date Amount  Start Month 
0061600000g0jXOAAY 1-Nov-15 0   1-Jan-16 
0061600000g0jXOAAY 1-Dec-15 0   1-Jan-16 
0061600000g0jXOAAY 1-Jan-16 1479.01  1-Jan-16 
0061600000g0jXOAAY 1-Feb-16 1479.01  1-Jan-16 
0061600000hSBQVAA4 1-Feb-15 0   1-Apr-15 
0061600000hSBQVAA4 1-Mar-15 0   1-Apr-15 
0061600000hSBQVAA4 1-Apr-15 1098.18  1-Apr-15 
0061600000hSBQVAA4 1-May-15 2890  1-Apr-15 

ответ

1

Вы можете легко рассчитать начало месяц с помощью запроса агрегации:

select sales_id, min(date) 
from t 
where amount > 0 
group by sales_id; 

Обратите внимание, что > 0 также устраняет NULL значения.

Вы можете включить это в свой желаемый результат, установленной с join или коррелировала подзапрос:

select t.*, mindate 
from t join 
    (select sales_id, min(date) as mindate 
     from t 
     where amount > 0 
     group by sales_id 
    ) tt 
    on t.sales_id = tt.sales_id; 
1

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

select sales_id,date,amount, 
(select min(date) from t where sales_id=t1.sales_id and amount > 0) start_month 
from t t1 

Другим вариантом будет производная таблица с минимальной датой для каждого идентификатора.

select t1.sales_id,t1.date,t1.amount,m.min_date 
from t t1 
join (select sales_id,min(date) min_date from t where amount > 0 group by sales_id) m 
on m.sales_id=t1.sales_id 
Смежные вопросы