@ Ответ PaulX близок, но разбиение не совсем верно.Вы можете сделать:
-- CTE for sample data
with your_table (account, num) as (
select 'abc', 20 from dual
union all select 'abc', 20 from dual
union all select 'abc', 30 from dual
union all select 'def', 20 from dual
union all select 'def', 30 from dual
union all select 'def', 30 from dual
)
select account, num,
case when row_number() over (partition by account, num order by null) = 1
then 1
else 0
end as output
from your_table;
ACCOUNT NUM OUTPUT
------- ---------- ----------
abc 20 1
abc 20 0
abc 30 1
def 20 1
def 30 1
def 30 0
(с поправкой на допустимые имена столбцов; надеюсь, у вас фактически нет идентификаторов в кавычках ...)
Если вам нужны нули, а не нули, просто не указывайтеelse 0
часть.И это просто предполагает, что под «первым» вы подразумеваете первое, возвращенное в вашем наборе результатов, так как в противном случае - по крайней мере, в тех столбцах, которые вы показали - очевидной альтернативы нет.Если у вас действительно есть другие столбцы, особенно если вы используете какие-либо другие для упорядочения набора результатов, то вы можете применить тот же порядок в предложении partition
, чтобы сделать его согласованным.