选择数字不同的情况,然后选择1否则0

时间:2019-03-28 18:10:05

标签: sql oracle distinct

我想获得预期的输出,以便当数字第一次出现在帐户组中时,然后显示1,否则,如果再次发生,则显示null或0。其他帐户组的逻辑相同。

我认为的逻辑是

SELECT b.StartTime, b.EndTime, b.StakeholderID
FROM TableB b
WHERE NOT EXISTS (SELECT 'x' FROM TableA a 
  WHERE b.StakeholderID=a.StakeholderID
  AND (a.StartTime<b.EndTime AND a.EndTime>b.StartTime))

3 个答案:

答案 0 :(得分:1)

使用滞后

  select *,case when number=lag(number) over(partition by account order by account)
           then 0 else 1 end as val
      from table_name

答案 1 :(得分:0)

您几乎拥有了!

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

答案 2 :(得分:0)

@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子句中应用相同的排序以使其一致。