Учитывая следующий 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
Но это не помогло. Любые идеи/предложения будут оценены. Благодаря
Спасибо. Однако, как запрошено в вопросе, есть ли способ закодировать это без использования фильтра 'where status = 'abc'' в базовой таблице? – labrynth
как вы хотите фильтровать строки для abc? Почему вы не хотите = – scaisEdge
Как бы то ни было, я обновил ответ на случай (Avoding где) – scaisEdge