最近活跃交易的索引

时间:2018-05-26 08:28:26

标签: sql oracle

我有三种类型的事务流,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

1 个答案:

答案 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(或分层查询)。但是,您可以干净地分离两个操作的逻辑,因此有一个更有效的解决方案。