2016-10-01 7 views
0

Учитывая следующий table_a:Использование CASE-заявления с разбиением в SQL

id | status | reg_date | so_date 
----+------------------------------ 
    1 | abc | 15-11-01 | 15-11-02 
    1 | def | 15-11-01 | 15-11-04 
    1 | abc | 15-11-01 | 15-11-06 
    2 | abc | 15-11-01 | 15-11-03 
    2 | abc | 15-11-01 | 15-11-04 
    2 | abc | 15-11-01 | 15-11-06 
    2 | abc | 15-11-01 | 15-11-08 
    3 | xyz | 15-11-01 | 15-11-03 
    3 | def | 15-11-01 | 15-11-08 
    3 | def | 15-11-01 | 15-11-09 

требуется следующее: Для каждой группы id, минимальная разница между so_date и reg_date, если status является «абв». Это дает следующую таблицу:

id | min_date 
----+---------- 
    1 | 1 
    2 | 2 
    3 | Null 

Следующий код будет достаточным:

select 
    id, 
    distinct datediff('day', reg_date, min(so_date) over (partition by id)) as min_date 
from table_a 
where status ilike '%abc%' 

Однако из-за ограничений других «выборов», использование фильтра where status ilike '%abc%' не представляется возможным в базовой таблице , Я пробовал использовать

select 
     id, 
     case when status is like '%abc%' then (distinct datediff('day', reg_date, min(so_date) over (partition by id))) end as min_date 
    from table_a 

Но это не помогло. Любые идеи/предложения будут оценены. Благодаря

ответ

1

на основе вашего образца должна быть

select 
    id 
    , min (datediff(so_date, reg_date)) as min_date 
from table_a 
where status ='abc' 
group by id 

, если вы не хотите, где летучая мышь случай, то

select 
    case status when 'abc' then id end 
    , case status when 'abc' then min (datediff(so_date, reg_date)) end as min_date 
from table_a 
group by id 
+0

Спасибо. Однако, как запрошено в вопросе, есть ли способ закодировать это без использования фильтра 'where status = 'abc'' в базовой таблице? – labrynth

+0

как вы хотите фильтровать строки для abc? Почему вы не хотите = – scaisEdge

+0

Как бы то ни было, я обновил ответ на случай (Avoding где) – scaisEdge