按顺序显示字段值的出现次数

时间:2014-03-29 19:54:36

标签: sql oracle

提前感谢您的帮助,并对“桌子”的外观感到抱歉。这是我的问题......

假设我有一个带有此表的子查询(想象粗体作为列标题)作为其输出 -

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()函数一起有用。寻找尽可能多的创意解决方案!

2 个答案:

答案 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。对不起戈登,没看到你的帖子。