0

これと同じタイトルの質問があることは承知していますが、それが私の質問に対応しているかどうかはわかりません。

次のようなデータがあります。

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

Excel '=COUNTIF($B$2:$B$6,C2)' で countif を使用すると、次のようなデータを取得できます (数式は発生した列にあります)。

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)

ここで提案されているように:COUNTIF集計関数に相当するSqlサーバー。上記は1つのレコードに対して機能しますが、問題は、次のように機能しないため、基準をハードコーディングするのではなく、Nxt 列の内容を参照するようにする必要があることです。

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

これは、Current と Nxt が実際には行で一致しないためだと思いますか?

参考までに、私のデータベースは Oracle 11 を使用しています。

4

2 に答える 2

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;

編集 :

フィドルのデモ

于 2013-10-03T12:09:10.963 に答える
1

これを試して :

SELECT id
      ,current
      ,nxt
      ,nvl2(nxt,decode(next,lead(current) over (partition by id order by id),1,0),0) occured
  FROM yourtable
于 2013-10-03T12:00:50.760 に答える