2012-06-05 4 views
0

Привет, у меня проблема. Я не знаю, может ли кто-нибудь помочь. У меня созданы вложенные таблицы и вставлены значения в таблицу.PL/SQL найти значения в вложенных таблицах

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

Так что будет 30 строк, вставленные в new_table каждый из которых представляет 1 день месяца в этом месяце (июнь). выше приведен пример первой строки с днем ​​= 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); 

например, 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 

ответ

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 
+0

Привет Спасибо за ответ. Если я хочу вставить эти результаты в другую таблицу с той же самой таблицей гнезд внутри, могу ли я сделать это? – user1332821

+0

INSERT INTO old_table a (день, t.часов, t.DATA) ТАБЛИЦА (a.value_hours) t old_table имеет ту же структуру, что и Nem_RM16, за исключением того, что строки пустые. предназначен для хранения результатов. – user1332821

+0

Вы можете использовать [COLLECT] (http://docs.oracle.com/cd/E11882_01/server.112/e26088/functions031.htm#SQLRF06304) для построения типа вложенной таблицы. –