我想获得预期的输出,以便当数字第一次出现在帐户组中时,然后显示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))
答案 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
子句中应用相同的排序以使其一致。