我有三种类型的事务流,ax1.plot(df1['High'], df1['Close']) #works
事务增加了一个索引(从1开始)。
ax1.plot(df1['Date'], df1['Close']) # doesn't work
交易
保持索引没有变化。从+
开始。
=
事务否定了上一个NULL
事务的影响,并返回到先前的值或NULL。
不同-
上的交易是独立的,+
订购ID
有一些一致性规则:ID
必须遵循(直接或间接)SEQ
而-
不能遵循+
(即没有嵌套否定)。 -
可以在两者之间发生任何数字。
因此,对于样本数据(见下文),这是预期结果(列-
)
=
我从这个分析函数开始
LAST_IDX
差不多完成,但 ID SEQ CODE LAST_IDX
---------- ---------- ---- ----------
1 1 + 1
1 2 = 1
1 3 = 1
1 4 + 2
1 5 = 2
1 6 - 1
1 7 = 1
1 8 + 3
1 9 = 3
1 10 - 1
2 1 + 1
中的SUM(decode(code,'+',1,'-',-1,0)) over (partition by id order by seq)
变为2而不是3。
所以我最终管理了这个有效的解决方案
+
但我希望必须有一个简单的解决方案。
有什么想法吗?
样本数据
seq = 8
答案 0 :(得分:0)
这不是一个真正的答案,因为它重申了OP的解决方案。
您对运营商的描述过度简化了他们的工作。我认为您提出的解决方案是最佳解决方案。我会把它写成:
select id, seq, code,
(case when last_value(case code when '+' then '+' when '-' then '-' end ignore nulls) over (partition by id order by seq ) = '+'
then sum(case code when '+' then 1 else 0 end) over (partition by id order by seq)
else sum(case code when '+' then 1 when '-' then -1 else 0 end) over (partition by id order by seq)
end) as last_idx
from tab
order by id, seq;
基本上,根据当前代码是'+'
还是'-'
,您有两种不同的方法,这就是您的逻辑所表达的内容。
您的解决方案非常有趣。我对操作的第一反应是需要递归CTE(或分层查询)。但是,您可以干净地分离两个操作的逻辑,因此有一个更有效的解决方案。