Один метод использует row_number()
:
select t.*
from (select t.*,
row_number() over (partition by prodid
order by (case when ind1 > 0 then 1 else 2 end),
(case when ind1 = 0 and ind2 > 0 then 1 else 2 end),
date desc
) as seqnum
from t
) t
where seqnum = 1;
Если вам нравится арифметика c, это можно упростить до:
select t.*
from (select t.*,
row_number() over (partition by prodid
order by ind1 desc, ind2 * (1 - ind1) desc, date desc
) as seqnum
from t
) t
where seqnum = 1;
Обратите внимание, что один прием при размещении логики c вместе гарантирует, что первый ряд используется в следующей ситуации:
1 0 0 2020-01-21
1 1 0 2020-01-20
1 1 1 2020-01-19
Вот почему вы не можете использовать order by ind1 desc, ind2 desc, date desc
(что довольно заманчиво).