0

こんにちは、誰かが助けてくれるかどうかわからない問題があります。ネストされたテーブルを作成し、テーブルに値を挿入しました。

CREATE OR REPLACE TYPE tt_hours AS OBJECT(hours INTEGER, data NUMBER);
/
CREATE OR REPLACE TYPE tt_day AS VARRAY(7) OF tt_hours;
/
CREATE TABLE NEM_RM16
(
  DAY                 DATE,
  VALUE_hours         tt_day
 );
INSERT INTO NEM_RM16
   (day, value_hours)
 VALUES
   (TO_DATE('01/06/2012 22:00:34'), 
     tt_DAY(         
       tt_hours(1,0.025727),         
       tt_hours(2,0.012047),         
       tt_hours(3,0.012857),         
       tt_hours(4,0.012107),         
       tt_hours(5,0.012849),         
       tt_hours(6,0.01215),         
       tt_hours(7,0.0129)));

そのため、new_table には 30 行が挿入され、それぞれが今月 (6 月) の 1 日を表します。上記は、day = 01/06/2012 で 8 時間のデータを含む最初の行の例です。

特定の日のすべての平均時間を見つけるプログラムを作成するにはどうすればよいですか。

結果は 7 行 (1 週間に 7 日) になるはずです。

tt_hours (1, average over the month)
tt_hours (2, average over the month)
..........

2 番目のテーブル:

 CREATE TABLE old_table ( tDAY DATE, VALUE_thours tt_day );

以下を使用して挿入しようとしました。結果を古いテーブルに挿入するには機能しませんでした。

insert into old_table (day, value_hours) values 
   (SELECT to_char(DAY, 'Day'), 
   hours, AVG(data) FROM NEM_RM16 n, TABLE(n.value_hours) v
   GROUP BY to_char(DAY, 'Day'), hours);

たとえば、old_table には、select ステートメントを実行した後、金曜日に次のデータが含まれている必要があります。時間と日付はネストされたテーブルにあり、tdate は DATE 型です。ご覧のとおり、結果はselectステートメントが生成したものですが、同じ構造化テーブルに挿入されています。

  tdate         HOURS        data 
  ----------- ---------- ----------
  Friday               1   0,025727
  Friday               2   0,012047
  Friday               3   0,012857
  Friday               4   0,012107
  Friday               5   0,012849
  Friday               6    0,01215
  Friday               7     0,0129
4

1 に答える 1

1

ラテラル結合を使用して、ネストされたテーブルから値を取得できます。

SQL> select n.day, v.hours, v.data from NEM_RM16 n, table(n.value_hours) v;

DAY              HOURS       DATA
----------- ---------- ----------
01/06/2012           1   0,025727
01/06/2012           2   0,012047
01/06/2012           3   0,012857
01/06/2012           4   0,012107
01/06/2012           5   0,012849
01/06/2012           6    0,01215
01/06/2012           7     0,0129

あなたの質問を本当に正しく理解しているかどうかはわかりませんが、上記のクエリから、次のような集計を実行できます。

SQL> SELECT to_char(DAY, 'Day') day_of_week, hours, AVG(data) avg_data
  2    FROM NEM_RM16 n, TABLE(n.value_hours) v
  3   GROUP BY to_char(DAY, 'Day'), hours;

DAY_OF_WEEK      HOURS   AVG_DATA
----------- ---------- ----------
Friday               1   0,025727
Friday               2   0,012047
Friday               3   0,012857
Friday               4   0,012107
Friday               5   0,012849
Friday               6    0,01215
Friday               7     0,0129

ネストされたテーブルを再構築する場合は、COLLECTを使用します。たとえば、次のようになります。

SELECT day_of_week, CAST(COLLECT(tt_hours(hours, avg_data)) AS tt_day)
  FROM (SELECT to_char(DAY, 'Day') day_of_week, hours, AVG(data) avg_data
          FROM NEM_RM16 n, TABLE(n.value_hours) v
         GROUP BY to_char(DAY, 'Day'), hours)
 GROUP BY day_of_week
于 2012-06-05T14:16:27.833 に答える