提前感谢您的帮助,并对“桌子”的外观感到抱歉。这是我的问题......
假设我有一个带有此表的子查询(想象粗体作为列标题)作为其输出 -
id 1 1 2 3 3 3 3 4 5 6 6 6
行动 o c o c o c c c
我希望我的新查询输出 -
id 1 1 2 3 3 3 3 4 5 6 6 6
行动 o c o c o c c c
ct 1 2 1 1 2 3 4 1 1 1 2 3
#c 0 1 0 1 2 2 3 0 0 1 2 3
#o 1 1 1 0 0 1 1 1 1 0 0 0
其中 ct 代表计数。基本上,我想计算(对于每个 id )连续 id 和动作的发生情况。让我知道这是否有意义,如果没有,我如何澄清我的问题。
注意:我意识到滞后/超前函数在这种情况下可能与row_number()函数一起有用。寻找尽可能多的创意解决方案!
答案 0 :(得分:1)
您正在寻找row_number()
分析函数:
select id, action, row_number() over (partition by id order by id) as ct
from table t;
对于#c
和#o
,您需要累积总和:
select id, action, row_number() over (partition by id order by id) as ct,
sum(case when action = 'c' then 1 else 0 end) over
(partition by id order by <some column here>) as "#c",
sum(case when action = 'c' then 1 else 0 end) over
(partition by id order by <some column here>) as "#o"
from table t;
需要注意的是,您需要一种方法来指定行的顺序 - id或日期时间戳等。 SQL结果集和表本质上是无序的,所以不知道一行是在另一行之前或之后。
答案 1 :(得分:0)
SQL> select id, action,
2 row_number() over(partition by id order by rowid) ct,
3 sum(decode(action,'c',1,0)) over(partition by id order by rowid) c#,
4 sum(decode(action,'o',1,0)) over(partition by id order by rowid) o#
5 from t1
6 /
ID A CT C# O#
---------- - ---------- ---------- ----------
1 o 1 0 1
1 c 2 1 1
2 o 1 0 1
3 c 1 1 0
3 c 2 2 0
3 o 3 2 1
3 c 4 3 1
4 o 1 0 1
5 o 1 0 1
6 c 1 1 0
6 c 2 2 0
6 c 3 3 0
P.S。对不起戈登,没看到你的帖子。