выберите случай, когда число отличается от 1 до 0 - PullRequest
0 голосов
/ 28 марта 2019

Я хочу получить ожидаемый результат, чтобы при первом появлении числа в группе счетов отображалось 1, в противном случае, если это произойдет в другой раз, показывалось бы ноль или 0. Та же логика для других групп счетов.

Логика, которую я могу представить:

select *,
case when number happens first time then 1 else null 
over (partition by account order by number) from table. 

account number  expected output
abc     20      1
abc     20      0
abc     30      1
def     20      1
def     30      1
def     30      0

Ответы [ 3 ]

1 голос
/ 28 марта 2019

использовать лаг

  select *,case when number=lag(number) over(partition by account order by account)
           then 0 else 1 end as val
      from table_name
0 голосов
/ 28 марта 2019

@ Ответ 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, чтобы сделать его согласованным.

0 голосов
/ 28 марта 2019

У тебя почти было это!

select account, number
case when Row_Number() OVER (partition by account order by number) = 1 THEN 1 END ExpOut
from table
...