Как создать VIEW, поворачивающее таблицу на 90 градусов

OLGA2
Дата: 29.07.2005 11:05:36
Есть таблица с такой структурой:
id NUMBER(5),
dt DATE, -- время 00:00:00
val _hour1 NUMBER(6),
...
val _hour24 NUMBER(6)
т.е. значения за часы суток dt лежат в полях типа val _hourN.

Мне нужно делать выборку из таблицы (по одному id и интервалу дат) в таком виде:
id NUMBER(5),
dt DATE, -- dt + hour*(1/24)
val NUMBER(6)

Как эффективнее создать VIEW (я, кроме как из 24-х UNION, ничего придумать не могу)? Или это делается только с помощью функции? VIEW для меня было бы предпочтительнее, если на выборку будет уходить не более 3 сек. (в таблице около 0.5 мил.записей).
Помогите, мастера, я с Oracle только на "ВЫ".
Belk
Дата: 29.07.2005 11:14:02
Не могу назвать себя профессионалом, я с Оракл тоже на "Вы", но по-моему тут не надо такой хитрый view выдумывать, а просто по-нормальному перепроектировать таблицу. А потом представление, если надо будет сделать выбоку за какой-то день, просто параметризовать... Таблица: id, date, value - все, имхо.
OLGA2
Дата: 29.07.2005 11:20:24
К сожалению, изменить структуру таблицы, невозможно. Это чужая база, из которой нам милостиво, после долгих уговоров, разрешили читать данные.
Если VIEW в данном случае никак не пролезет, значит буду воять функцию.
123
Дата: 29.07.2005 11:27:14
Попробуй воспользоваться CASEоми
OA User
Дата: 29.07.2005 11:35:19
OLGA2
Есть таблица с такой структурой:
id NUMBER(5),
dt DATE, -- время 00:00:00
val _hour1 NUMBER(6),
...
val _hour24 NUMBER(6)
т.е. значения за часы суток dt лежат в полях типа val _hourN.

Мне нужно делать выборку из таблицы (по одному id и интервалу дат) в таком виде:
id NUMBER(5),
dt DATE, -- dt + hour*(1/24)
val NUMBER(6)

Как эффективнее создать VIEW (я, кроме как из 24-х UNION, ничего придумать не могу)? Или это делается только с помощью функции? VIEW для меня было бы предпочтительнее, если на выборку будет уходить не более 3 сек. (в таблице около 0.5 мил.записей).
Помогите, мастера, я с Oracle только на "ВЫ".


А почему Вы решили, что такой union будет работать медленно?
Наверняка по дате есть индекс, может просто попробовать создать представление из 24 union и посмотреть план запроса?
Elic
Дата: 29.07.2005 11:37:22
\nselect id, dt + (pivot.i - 1) / 24 as dt,\n    decode\n    ( pivot.i,\n         1, val _hour1,\n        ...\n        24, val _hour24\n    ) as val\n  from "таблица", (select rownum as i from all_objects where rownum <= 24) pivot\n
Другие варианты pivot-таблицы
Bely
Дата: 29.07.2005 11:38:24
OLGA2
Как эффективнее создать VIEW (я, кроме как из 24-х UNION, ничего придумать не могу)?
А что плохого в 24-х юнионах?
24-раза copy paste, создать VIEW и забыть про эту структуру как страшный сон.

Вот только ID будут совпадать у разных строк.
Это критично?
zipfer
Дата: 29.07.2005 11:44:05
select Tabl.id,Tabl.Date,
    max(decode(Dates.Date,dt + interval '1' hour, Tabl.val_hour1, null)) Date_1h,
    max(decode(Dates.Date,dt + interval '2' hour, Tabl.val_hour2, null)) Date_2h,
    max(decode(Dates.Date,dt + interval '3' hour, Tabl.val_hour3, null)) Date_3h,
    max(decode(Dates.Date,dt + interval '4' hour, Tabl.val_hour4, null)) Date_4h,
    max(decode(Dates.Date,dt + interval '5' hour, Tabl.val_hour5, null)) Date_5h,
    ...
from
 
 (select id,date,dt + interval '1' hour, dt + interval '2' hour,dt + interval '3' hour,
         dt + interval '4' hour, dt + interval '5' hour, dt + interval '6' hour,
         dt + interval '7' hour, dt + interval '8' hour, dt + interval '9' hour,
         dt + interval '10' hour, dt + interval '11' hour, dt + interval '12' hour,
         dt + interval '13' hour, dt + interval '14' hour, dt + interval '15' hour,
         dt + interval '16' hour, dt + interval '17' hour, dt + interval '18' hour,
         dt + interval '19' hour, dt + interval '20' hour, dt + interval '22' hour, 
         dt + interval '23' hour, dt + interval '24' hour
) Dates, Tabl where Tabl.id = Dates.Id and Tabl.Date=Dates.Date 	 
zipfer
Дата: 29.07.2005 12:03:05
Простите за последний пост, наглючил невероятно!!! :((
OLGA2
Дата: 01.08.2005 13:11:10
И так, VIEW я создала. Теперь возникла другая заморочка:
1. Прилинковала к серверу MSSQL сервер Oracle8.1 Линк с правами пользователя Оракла "reader", вижу оракловские таблицы и View через MS Enterprise Manager.
2. В Оракле "reader" имеет права на чтение одной таблицы и на создание VIEW. Создала VIEW reader.myview. В SQL Plus все прекрасно выбирается.
3. В MS Query Analyzer запускаю 2 запроса к прилинкованным объектам -
напрямую к таблице:
select * from [bl.cdo.ups.ru]..ZVK_DBA.DSGRPLAN_ARCHIV - работает
к View:
select * from [bl.cdo.ups.ru]..rdgreader.myview - не работает
Ошибка:
OLE DB provider 'bl.cdo.ups.ru' does not contain table '"rdgreader"."getrdg"'. The table either does not exist or the current user does not have permissions on that table.
Каких прав не хватает?