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 行,每行代表本月(六月)的一个月中的 1 天。以上是第一行的示例,其中 day = 01/06/2012 具有 8 小时的数据。

我如何编写一个程序来查找所有特定日期的所有平均小时数,例如表中所有星期一的所有第一小时的平均值(天哪,我希望我说得通)。

结果应该是 7 行(一周 7 天)

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

第二张表:

 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);

例如,在运行您的 select 语句后,old_table 在星期五应该有以下数据。小时和日期在嵌套表中,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 回答