跨2列的SQL等效countif()

时间:2013-10-03 11:47:49

标签: sql oracle count

我知道有一个与此问题相同的问题,但我不确定它是否解决了我的问题。

我的数据如下:

ID     Current    Nxt  
1      1A          1B
1      1B          1C
2      2A          2B
3      3A          3B
3      3B

在Excel中使用countif'= COUNTIF($ B $ 2:$ B $ 6,C2)'我可以将数据看起来像这样(公式在已发生的列中):

ID     Current    Nxt  Occurred
1      1A          1B  1 
1      1B          1C  0 
2      2A          2B  0
3      3A          3B  1 
3      3B              0 

基本上我只是想知道Nxt预定事件是否确实发生过(如果数据中存在,则表示该事件。)

但是,我想在我的SQL查询中复制它,如下所示:

SELECT
ID,
Current,
Nxt

FROM
Table

我认为答案可能在于:

sum(case when Current='1B' THEN 1 ELSE 0 END) over (partition by Current)

如此处所示:Sql Server equivalent of a COUNTIF aggregate function。以上工作适用于一条记录,但问题是我需要使条件引用Nxt列的内容而不是硬编码,因为以下内容不起作用:

sum(case when Current=Nxt THEN 1 ELSE 0 END) over (partition by Current)

我想这是因为Current和Nxt实际上从来没有在一行上匹配?

作为参考,我的数据库使用Oracle 11。

2 个答案:

答案 0 :(得分:1)

试试这个:

SELECT id
      ,current
      ,nxt
      ,nvl2(nxt,decode(next,lead(current) over (partition by id order by id),1,0),0) occured
  FROM yourtable

答案 1 :(得分:1)

我建议你做以下事情:

SELECT id, current, nxt
  FROM (SELECT id, current, nxt,
               CASE lead(current)
                       over (partition by id order by id)
                  WHEN nxt THEN 1
                  ELSE 0
               END AS occured
          FROM myTable)
 WHERE occured = 1;

编辑:

Fiddle Demo