1

(ユーザー側で簡単にするために)最終的にExcelにインポートされるが、プリンターにも自動的に実行される可能性があるOracleクエリを使用して、いくつかのデータを集約したいというレポートを書いています。処理はクエリ自体で行う必要があります。

oracleバージョン10.2.0.5.0(v $ instanceからバージョンを選択)を使用しています。

OK、だから私はこのクエリを使用しています。

SELECT substr(arg_string,1,4) node,
               substr(numtodsinterval(end_time-start_time,'DAY'), 12, 8) dur,
               row_number() over (order by substr(arg_string,1,4),
                                           start_time) rn
          FROM pro.program_status
          where  prog_name like ('%v8x-6%')
      and    start_time > sysdate - 10;

これは、次のようなデータセットを返します。

NODE DUR      RN
---- -------- ----------
s002 00:25:40 1
s002 00:27:21 2
s002 00:03:20 3
s002 00:27:44 4
...
s004 00:21:29 22
s004 00:22:19 23
s004 00:05:13 24
s004 00:22:47 25
...
s005 00:03:13 42
s005 00:00:46 43
s005 00:02:01 44
s005 00:00:45 45
...
s152 00:01:13 1840

そして、私の希望する出力は次のとおりです。

NODE DUR1     DUR2     DUR3
---- -------- -------- ----------
s002 00:25:40 00:27:21 00:03:20
s004 00:21:29 00:22:19 00:05:13
s005 00:03:13 00:00:46 00:02:01
and so on

次のクエリを試しました。

SELECT node,
       max( CASE WHEN rn = 1 THEN dur ELSE NULL END ) dur1,
       max( CASE WHEN rn = 2 THEN dur ELSE NULL END ) dur2,
       max( CASE WHEN rn = 3 THEN dur ELSE NULL END ) dur3
  FROM (SELECT substr(arg_string,1,4) node,
               substr(numtodsinterval(end_time-start_time,'DAY'), 12, 8) dur,
               row_number() over (order by substr(arg_string,1,4),
                                           start_time) rn
          FROM pro.program_status
          where  prog_name like ('%v8x-6%')
          and    start_time > sysdate - 10)
group by node
/

ただし、「s002」のみに1、2、および3のラベルが付けられているため、次の結果が返されます。

NODE DUR1     DUR2     DUR3     
---- -------- -------- -------- 
s002 00:25:40 00:27:21 00:03:20 
s004
s005
s009
and so on

私は明らかな何かを見逃していると確信していますが、このサイトや他の多くのサイトを検索した後、これを正しく機能させることができないようです。

もう少し詳しく説明すると、各ノードが何回表示されるか、または1日にいくつのノードが表示されるかはわかりません。

前もって感謝します。トム

4

1 に答える 1

2

試す:

SELECT node,
       max( CASE WHEN rn = 1 THEN dur ELSE NULL END ) dur1,
       max( CASE WHEN rn = 2 THEN dur ELSE NULL END ) dur2,
       max( CASE WHEN rn = 3 THEN dur ELSE NULL END ) dur3
FROM (SELECT substr(arg_string,1,4) node,
             substr(numtodsinterval(end_time-start_time,'DAY'), 12, 8) dur,
             row_number() over (partition by substr(arg_string,1,4)
                                order by substr(arg_string,1,4), start_time) rn
      FROM pro.program_status
      where  prog_name like ('%v8x-6%')
        and  start_time > sysdate - 10)
group by node
于 2013-02-06T14:35:23.600 に答える