powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Informix [игнор отключен] [закрыт для гостей] / Заполнение столбца в таблице из результатов предыдущих столбцов
34 сообщений из 34, показаны все 2 страниц
Заполнение столбца в таблице из результатов предыдущих столбцов
    #36250248
PaulS1986
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа подскажите пожалуйста!
Есть таблица :

create table "informix".downtime
(
did serial not null ,
stop_time datetime year to second,
start_time datetime year to second,
uptime integer,
primary key (did) constraint "informix".pk_downtime
);
revoke all on "informix".downtime from "public" as "informix";

первые 2 столбца stop_time и start_time заполнены данными, как из значения в строке N в 1 столбце отнять значение N-1 во втором и записать результат в N-ную строку столбца uptime ???
...
Рейтинг: 0 / 0
Заполнение столбца в таблице из результатов предыдущих столбцов
    #36250286
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulS1986
первые 2 столбца stop_time и start_time заполнены данными, как из значения в строке N в 1 столбце отнять значение N-1 во втором и записать результат в N-ную строку столбца uptime ???
В чём? В секундах?
Не поверишь - поиск по форуму по "разность дат" рулит :)

тынц
...
Рейтинг: 0 / 0
Заполнение столбца в таблице из результатов предыдущих столбцов
    #36250289
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пардон, про разные строки провтыкал... минутку...
...
Рейтинг: 0 / 0
Заполнение столбца в таблице из результатов предыдущих столбцов
    #36250322
PaulS1986
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да можно и в секундах!
через select вывожу данные в одну строку, а как вычесть и вписать хз
...
Рейтинг: 0 / 0
Заполнение столбца в таблице из результатов предыдущих столбцов
    #36250334
TOP 1 подзапрос или чего там есть похожего в Infirmix-е.
...
Рейтинг: 0 / 0
Заполнение столбца в таблице из результатов предыдущих столбцов
    #36250346
Видимо, First 1-подзапрос нужно юзать... :)
...
Рейтинг: 0 / 0
Заполнение столбца в таблице из результатов предыдущих столбцов
    #36250379
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый Э - Эх,
нельзя first в подзапросах.


PaulS1986, Пример напишите, с содержимым таблицы, с желаемым результатом
...
Рейтинг: 0 / 0
Заполнение столбца в таблице из результатов предыдущих столбцов
    #36250426
Фотография TmpFile()
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select d1.did,  
        (select d2.start_time 
                          from downtime d2
                         where d2.did = (select max(did)
                                           from downtime
                                          where did <  d1.did)),  d1.stop_time ,  
        (select d2.start_time 
                          from downtime d2
                         where d2.did = (select max(did)
                                           from downtime
                                          where did <  d1.did)) - d1.stop_time    
  from downtime d1
...
Рейтинг: 0 / 0
Заполнение столбца в таблице из результатов предыдущих столбцов
    #36250428
Журавлев ДенисДобрый Э - Эх,
нельзя first в подзапросах.


PaulS1986, Пример напишите, с содержимым таблицы, с желаемым результатомА агрегированный подзапрос можно? Ну, что-то в духе:
Код: plaintext
1.
2.
select t1.*,
       (select max(t0.stop_time) from t t0 where t0.did < t1.did)
  from t t1
...
Рейтинг: 0 / 0
Заполнение столбца в таблице из результатов предыдущих столбцов
    #36250502
PaulS1986
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Журавлев ДенисДобрый Э - Эх,
нельзя first в подзапросах.


PaulS1986, Пример напишите, с содержимым таблицы, с желаемым результатом

Пример :

did stop_time start_time uptime

13 2009-02-05 10:24:06 2009-02-05 10:28:19
14 2009-03-21 13:08:55 2009-03-21 13:10:28

желаемый результат :

did stop_time start_time uptime

13 2009-02-05 10:24:06 2009-02-05 10:28:19
14 2009-03-21 13:08:55 2009-03-21 13:10:28 44 02:40:36

вот так должно получится в таблице
...
Рейтинг: 0 / 0
Заполнение столбца в таблице из результатов предыдущих столбцов
    #36250506
PaulS1986
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TmpFile(),

Да примерно так, надо обмозговать :)
...
Рейтинг: 0 / 0
Заполнение столбца в таблице из результатов предыдущих столбцов
    #36250560
Фотография TmpFile()
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
drop table "informix".downtime;
create table "informix".downtime
(
did serial not null ,
stop_time datetime year to second,
start_time datetime year to second,
uptime interval day to second,
primary key (did) constraint "informix".pk_downtime
);

insert into downtime (stop_time, start_time) values (current, current + interval ( 5 ) second to second );
insert into downtime (stop_time, start_time) values (current, current + interval ( 7 ) second to second );
insert into downtime (stop_time, start_time) values (current, current + interval ( 1 ) second to second );

select d1.did,  
       d1.stop_time - (select d2.start_time 
                         from downtime d2
                        where d2.did = (select max(did)
                                          from downtime
                                         where did <  d1.did)) uptime    
  from downtime d1
  into temp t_downtime with no log; 

update downtime
   set uptime = (select uptime
                   from t_downtime
                  where did = downtime.did)   
                  
select * from downtime;
...
Рейтинг: 0 / 0
Заполнение столбца в таблице из результатов предыдущих столбцов
    #36250575
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
from downtime d1, outer downtime d2
where d1.did=d2.did -1
...
Рейтинг: 0 / 0
Заполнение столбца в таблице из результатов предыдущих столбцов
    #36250595
Фотография TmpFile()
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Журавлев Денис,

Код: plaintext
1.
2.
from downtime d1, outer downtime d2
where d1.did=d2.did - 1 

Это будет нормально, если таблица накопительная и в нее данные не "перезаливают".
Или там может быть разные устройства в одну и туже таблицу данные льют.
...
Рейтинг: 0 / 0
Заполнение столбца в таблице из результатов предыдущих столбцов
    #36250606
PaulS1986
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TmpFile()
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
drop table "informix".downtime;
create table "informix".downtime
(
did serial not null ,
stop_time datetime year to second,
start_time datetime year to second,
uptime interval day to second,
primary key (did) constraint "informix".pk_downtime
);

insert into downtime (stop_time, start_time) values (current, current + interval ( 5 ) second to second );
insert into downtime (stop_time, start_time) values (current, current + interval ( 7 ) second to second );
insert into downtime (stop_time, start_time) values (current, current + interval ( 1 ) second to second );

select d1.did,  
       d1.stop_time - (select d2.start_time 
                         from downtime d2
                        where d2.did = (select max(did)
                                          from downtime
                                         where did <  d1.did)) uptime    
  from downtime d1
  into temp t_downtime with no log; 

update downtime
   set uptime = (select uptime
                   from t_downtime
                  where did = downtime.did)   
                  
select * from downtime;


TmpFile() ООооо.... ОГРОМНЕЙШЕЕ СПАСИБО!!! Я начало делал так же, но с селектами запутался!
...
Рейтинг: 0 / 0
Заполнение столбца в таблице из результатов предыдущих столбцов
    #36250714
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TmpFile(),

а где идентикатор устройства?

мне как сказали я так и понял "отнять значение N-1" и под тестовый пример кстати мое решение подходит
...
Рейтинг: 0 / 0
Заполнение столбца в таблице из результатов предыдущих столбцов
    #36250723
PaulS1986
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
блин, рано радовался!

ругается на :
select d1.did,
d1.stop_time - (select d2.start_time
from downtime d2
where d2.did = (select max(did)
from downtime
where did < d1.did)) uptime
from downtime d1
into temp t_downtime with no log;

update downtime
set uptime = (select uptime
from t_downtime
where did = downtime.did)


-1260 It is not possible to convert between the specified types.
...
Рейтинг: 0 / 0
Заполнение столбца в таблице из результатов предыдущих столбцов
    #36250749
olleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PaulS1986,

я так и не понял из вопроса и примера:

uptime interval day to second,
или
uptime integer ?
...
Рейтинг: 0 / 0
Заполнение столбца в таблице из результатов предыдущих столбцов
    #36250791
PaulS1986
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uptime integer
...
Рейтинг: 0 / 0
Заполнение столбца в таблице из результатов предыдущих столбцов
    #36250860
olleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тогда исправляйте:

PaulS1986
желаемый результат :

did stop_time start_time uptime

13 2009-02-05 10:24:06 2009-02-05 10:28:19
14 2009-03-21 13:08:55 2009-03-21 13:10:28 44 02:40:36

вот так должно получится в таблице

44 02:40:36 это не integer
...
Рейтинг: 0 / 0
Заполнение столбца в таблице из результатов предыдущих столбцов
    #36250917
olleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот integer:

cast(
cast('44 02:40:36' as interval day to second)
as interval second(9) to second)||' '+0
...
Рейтинг: 0 / 0
Заполнение столбца в таблице из результатов предыдущих столбцов
    #36250936
PaulS1986
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
olleg,

Спасибо! в раздумьях...
...
Рейтинг: 0 / 0
Заполнение столбца в таблице из результатов предыдущих столбцов
    #36250966
olleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PaulS1986olleg,

Спасибо! в раздумьях...

Спасибо не мне, а АнатоЛой, за его ссылку в первом же посте
...
Рейтинг: 0 / 0
Заполнение столбца в таблице из результатов предыдущих столбцов
    #36251582
PaulS1986
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TmpFile()
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
drop table "informix".downtime;
create table "informix".downtime
(
did serial not null ,
stop_time datetime year to second,
start_time datetime year to second,
uptime interval day to second,
primary key (did) constraint "informix".pk_downtime
);

insert into downtime (stop_time, start_time) values (current, current + interval ( 5 ) second to second );
insert into downtime (stop_time, start_time) values (current, current + interval ( 7 ) second to second );
insert into downtime (stop_time, start_time) values (current, current + interval ( 1 ) second to second );

select d1.did,  
       d1.stop_time - (select d2.start_time 
                         from downtime d2
                        where d2.did = (select max(did)
                                          from downtime
                                         where did <  d1.did)) uptime    
  from downtime d1
  into temp t_downtime with no log; 

update downtime
   set uptime = (select uptime
                   from t_downtime
                  where did = downtime.did)   
                  
select * from downtime;


TmpFile() есть вопросы :
в строке where did < d1.did)) uptime может должно быть так :where did < d1.did)) d1.uptime ???

что есть t_downtime ?
...
Рейтинг: 0 / 0
Заполнение столбца в таблице из результатов предыдущих столбцов
    #36251627
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulS1986
TmpFile() есть вопросы :
в строке where did < d1.did)) uptime может должно быть так :where did < d1.did)) d1.uptime ???


uptime есть имя столбца, полученного для текущего d1.did как

d1.stop_time - (select d2.start_time
from downtime d2
where d2.did = (select max(did)
from downtime
where did < d1.did))

PaulS1986
что есть t_downtime ?
t_downtime есть имя создаваемой временной таблицы, хранящей результат выполнения select
...
Рейтинг: 0 / 0
Заполнение столбца в таблице из результатов предыдущих столбцов
    #36251879
Фотография TmpFile()
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АнатоЛойPaulS1986
что есть t_downtime ?
t_downtime есть имя создаваемой временной таблицы, хранящей результат выполнения select

Этот огород с временной таблицей от того, что в UPDATE нельзя использовать конструкцию с подзапросом из модифицируемой таблицы.
Да и вообще читать документацию и теорию учить.
Может вам вполне сгодиться вид (view) создать, на основе запроса приведенного выше, и уже его использовать для поставленных целей. Кстати, именно от них все и зависит. Для чего вообще этот огород нужен?
...
Рейтинг: 0 / 0
Заполнение столбца в таблице из результатов предыдущих столбцов
    #36252362
PaulS1986
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TmpFile(),

Этот огород нужен для вычисления времени работы от включения до выключения
...
Рейтинг: 0 / 0
Заполнение столбца в таблице из результатов предыдущих столбцов
    #36254017
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulS1986, Вы несколько не так поняли вопрос... Насколько часто эта операция нужна? если эти данные нужно хранить постоянно - то варианта как минимум 2:
1. Делать вычисление uptime оперативно и сохранять сразу по факту занесения очередной записи в таблицу
2. Делать обновление строк периодически - для которых uptime is null

3 вариант: каждый раз считать его на лету.

Всё это время обсуждался как раз второй вариант. Я бы выбрал 1-ый. А может вас вполне устроит 3-ий - без поля в самой таблице...
...
Рейтинг: 0 / 0
Заполнение столбца в таблице из результатов предыдущих столбцов
    #36263660
PaulS1986
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Господа, добил я этот скрипт, вот что получилось :


STOP='YYYY-MM-DD HH:MM:SS'
START='YYYY-MM-DD HH:MM:SS'
#
dbaccess dbadb <<EOF!
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
INSERT INTO downtime(stop_time,start_time) VALUES('$STOP','$START');
SELECT d1.did, 
.......d1.stop_time - (select d2.start_time 
.....................from downtime d2
.......................where d2.did = (select max(did)
.........................................from downtime
.........................................where did <  d1.did)) uptime                                                   
FROM downtime d1
INTO temp t1_downtime with no log;

SELECT did, uptime FROM t1_downtime
WHERE did=(select max(did) from t1_downtime)
INTO temp t2_downtime with no log;

SELECT did,
..........cast(cast(uptime as interval day to second)
..........as interval second( 9 ) to second)|| ' '+ 0  uptime                     
FROM t2_downtime
INTO temp t3_downtime with no log;

UPDATE downtime
   SET uptime=(select uptime from t3_downtime where did=downtime.did);
!EOF

Всем СПС за помощь!!!:)
...
Рейтинг: 0 / 0
Заполнение столбца в таблице из результатов предыдущих столбцов
    #36263743
АнатоЛой
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulS1986
.......d1.stop_time - (select d2.start_time

PaulS1986, пользуй кнопку "SRC"...
...
Рейтинг: 0 / 0
Заполнение столбца в таблице из результатов предыдущих столбцов
    #36267371
PaulS1986
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ollegВот integer:

cast(
cast('44 02:40:36' as interval day to second)
as interval second(9) to second)||' '+0

А как лучше изменить этот запрос, если дата не '44 02:40:36' а скажем '144 02:40:36' ?
...
Рейтинг: 0 / 0
Заполнение столбца в таблице из результатов предыдущих столбцов
    #36267527
olleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PaulS1986ollegВот integer:

cast(
cast('44 02:40:36' as interval day to second)
as interval second(9) to second)||' '+0

А как лучше изменить этот запрос, если дата не '44 02:40:36' а скажем '144 02:40:36' ?

А что не так в запросе?
Какую ошибку возвращает сервер?

А в чем разница между этими двумя выражениями:
interval second to second
interval second(9) to second
...
Рейтинг: 0 / 0
Заполнение столбца в таблице из результатов предыдущих столбцов
    #36268658
PaulS1986
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если число дней больше 100 вылазит ошибка :

1265: Overflow occurred on a datetime or interval operation.
Error in line 4
Near character position 14

а если меньше то работает О_о
...
Рейтинг: 0 / 0
Заполнение столбца в таблице из результатов предыдущих столбцов
    #36268853
PaulS1986
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
получилось!:)
запрос :
SELECT
Код: plaintext
cast('144 02:40:36' AS interval second to second)
FROM downtime
...
Рейтинг: 0 / 0
34 сообщений из 34, показаны все 2 страниц
Форумы / Informix [игнор отключен] [закрыт для гостей] / Заполнение столбца в таблице из результатов предыдущих столбцов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]