powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Запсро на подсчет продолжительности периода
18 сообщений из 18, страница 1 из 1
Запсро на подсчет продолжительности периода
    #38789261
AlexeyFV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Есть таблицы

STAT
---------------
ID - intger - PK
DATA - timestamp - дата и время состояния
DATCHIK - integer - номер датчика
STATUS - integer - статус датчика
-----------------

в таблицу ежесенкундно заносятся данные по состоянию датчика, 0 - выкл 1 - вкл. За несколько часов датчик может находиться продолжительное время во включенном состояние так и в выключенном.
Как мне определить продолжительность последних периодов (два последних периода) нахождения датчика в состоянии вкл (1).?
Предполагаю простым перебором по выборке в ХП, но кажется это не всем правильный подход.

Версия FB 2.5
...
Рейтинг: 0 / 0
Запсро на подсчет продолжительности периода
    #38789288
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexeyFVПредполагаю простым перебором по выборке в ХП, но кажется это не всем
правильный подход.
Это оптимальный подход.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Запсро на подсчет продолжительности периода
    #38789293
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexeyFV,

какие-нибудь данные для примера можете привести ? может ли так быть, что для одного и того же датчика два и более раз подряд в поле status будет 1 или 0 (т.е. может ли что-то там "сглючить" в железках) ?
...
Рейтинг: 0 / 0
Запсро на подсчет продолжительности периода
    #38789296
AlexeyFV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,
спасибо
...
Рейтинг: 0 / 0
Запсро на подсчет продолжительности периода
    #38789310
AlexeyFV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Таблоид,
это посекундное состояние по датчику, состояние датчика может меняться, но всегда есть длительные однородные состояния

Пример по датчику. Дата и его состояние
-------------------------
28.10.2014 15:00:04 - 1
28.10.2014 15:00:03 - 1
28.10.2014 15:00:02 - 1
28.10.2014 15:00:01 - 1
............................
28.10.2014 14:04:04 - 0
28.10.2014 14:04:03 - 0
28.10.2014 14:04:02 - 0
28.10.2014 14:04:01 - 0
............................
28.10.2014 12:04:03 - 1
28.10.2014 12:04:02 - 1
28.10.2014 12:04:01 - 1
---------------------
...
Рейтинг: 0 / 0
Запсро на подсчет продолжительности периода
    #38789322
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexeyFVэто посекундное состояние по датчику, состояние датчика может меняться, но всегда есть длительные однородные состояния
А есть смысл хранить час по секундам и состояниям, когда можно триггером или процедурой обрезать лишние строки и вместо 86тыс записей одну за час?
...
Рейтинг: 0 / 0
Запсро на подсчет продолжительности периода
    #38789447
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexeyFVпосекундное состояние по датчику, состояние датчика может меняться, но всегда есть длительные однородные состоянияЕсли нужно вытаскивать два последних периода состояния вкл/выкл только по ОДНОМУ (заранее выбранному) датчику, то прототип может быть таким:
ddl
Код: 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.
-- create sequence g_sensor; commit;
alter sequence g_sensor restart with 0;
recreate table sensor(id int primary key, dts timestamp, sid int default 1, sta int);
commit;

insert into sensor (id, dts, sid, sta) values (1, '14-oct-2014 15:10:19', 1, 1);
insert into sensor (id, dts, sid, sta) values (2, '14-oct-2014 15:10:20', 1, 1);
insert into sensor (id, dts, sid, sta) values (3, '14-oct-2014 15:10:21', 1, 1);
insert into sensor (id, dts, sid, sta) values (4, '14-oct-2014 15:10:22', 1, 1);
insert into sensor (id, dts, sid, sta) values (5, '14-oct-2014 15:10:23', 1, 0);
insert into sensor (id, dts, sid, sta) values (6, '14-oct-2014 15:10:24', 1, 0);
insert into sensor (id, dts, sid, sta) values (7, '14-oct-2014 15:10:25', 1, 1);
insert into sensor (id, dts, sid, sta) values (8, '14-oct-2014 15:10:26', 1, 1);
insert into sensor (id, dts, sid, sta) values (9, '14-oct-2014 15:10:27', 1, 1);
insert into sensor (id, dts, sid, sta) values (10, '14-oct-2014 15:10:28', 1, 1);
insert into sensor (id, dts, sid, sta) values (11, '14-oct-2014 15:10:29', 1, 0);
insert into sensor (id, dts, sid, sta) values (12, '14-oct-2014 15:10:30', 1, 1);
insert into sensor (id, dts, sid, sta) values (13, '14-oct-2014 15:10:31', 1, 1);
insert into sensor (id, dts, sid, sta) values (14, '14-oct-2014 15:10:32', 1, 1);
insert into sensor (id, dts, sid, sta) values (15, '14-oct-2014 15:10:33', 1, 0);
insert into sensor (id, dts, sid, sta) values (16, '14-oct-2014 15:10:34', 1, 1);
insert into sensor (id, dts, sid, sta) values (17, '14-oct-2014 15:10:35', 1, 1);
insert into sensor (id, dts, sid, sta) values (18, '14-oct-2014 15:10:36', 1, 1);
insert into sensor (id, dts, sid, sta) values (19, '14-oct-2014 15:10:37', 1, 1);
commit;
create index sensor_sid_dts on sensor(sid, dts);
commit;
Query:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
with
a as (
    select s1.id, s1.sid, s1.dts, s1.sta
           ,(select id from sensor sx where sx.sid=s1.sid and sx.dts > s1.dts and sx.sta <> s1.sta rows 1) seria
    from sensor s1
)
select
    sid --, sta --, seria
    --,min( iif(sta=0, dts, null) ) disabled_beg
    --,max( iif(sta=0, dts, null) ) disabled_end
    ,min( iif(sta=1, dts, null) ) enabled_beg
    ,max( iif(sta=1, dts, null) ) enabled_end
from a
group by sid, sta, seria
order by enabled_beg desc nulls last rows 2;

Если же кол-во датчиков, по которым нужно вытащить периоды, два и более, то юзайте ХП, как выше сказал ДС.
...
Рейтинг: 0 / 0
Запсро на подсчет продолжительности периода
    #38789449
AlexeyFV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadmanAlexeyFVэто посекундное состояние по датчику, состояние датчика может меняться, но всегда есть длительные однородные состояния
А есть смысл хранить час по секундам и состояниям, когда можно триггером или процедурой обрезать лишние строки и вместо 86тыс записей одну за час?
тогда усложнится построение горизонтальной развертки по состояниям датчиков.
сейчас я делаю простую выборку , а придется сложную ХП с проверкой пограничных переходов.
Изначально я делал запись только при смене состояний датчика, но с ростом числа датчиков до 50 геометрически выросла сложность ХП для полного горизонтального снимка датчиков по времени.
Датчики собирают состояние по техпроцессу, и нужно знать их состояние в любой момент времени.
...
Рейтинг: 0 / 0
Запсро на подсчет продолжительности периода
    #38789454
AlexeyFV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Таблоид,
Спасибо, буду пробовать данное направление.
...
Рейтинг: 0 / 0
Запсро на подсчет продолжительности периода
    #38789464
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хранить в 2 видах? и так и эдак, писать триггером, читать тот вид, который удобней.
...
Рейтинг: 0 / 0
Запсро на подсчет продолжительности периода
    #38789473
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexeyFVИзначально я делал запись только при смене состояний датчика, но с ростом числа датчиков до 50 геометрически выросла сложность ХП для полного горизонтального снимка датчиков по времени.
Вот еще на этом этапе стоило спросить совета, потому как не должна сложность "геометрически" расти при правильно спроектированной таблице.
...
Рейтинг: 0 / 0
Запсро на подсчет продолжительности периода
    #38789532
AlexeyFV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadmanAlexeyFVИзначально я делал запись только при смене состояний датчика, но с ростом числа датчиков до 50 геометрически выросла сложность ХП для полного горизонтального снимка датчиков по времени.
Вот еще на этом этапе стоило спросить совета, потому как не должна сложность "геометрически" расти при правильно спроектированной таблице.
Структура таблицы - выше описана.
Число датчиков на текущий момент 60.
Поскольку состояния датчиков в неустоявщемся переходе могут меняться быстро , то для понимая переходных процессов требуется строить горизонтальную выборку по датчикам в разрезе посекундно.

дата время, датчик 1. датчик 2 ...... датчик 60

с точки зрения уменьшения объема, да эффективнее хранить только переходные моменты, но не всегда даже нормализация таблиц оправдана. Так и в этой ситуации, проще хранить ВЕСЬ объем и делать по нему выборку, нежели добавлять в выборки недостающие данные из пограничных переходов.
Возможно я ошибаюсь. Но сейчас ХП для горизонтальной выборки у меня выглядит так.
Код: plsql
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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
create or alter procedure LINIYA1_SEL
returns (
    DATA_EVENTS type of column LINIYA1.DATA_EVENTS,
    O_DATA varchar(50),
    O_TIME varchar(8),
    O_DIAPAZON varchar(15),
    O_HOUR integer,
    O_C_P1 integer,
    O_C_P2 integer,
    O_C_P3 integer,
    O_C_P4 integer,
    O_C_P5 integer,
    O_C_P6 integer,
    O_C_P7 integer,
    O_C_P8 integer,
    O_C_P9 integer,
    O_C_P10 integer,
    O_C_P11 integer,
    O_C_P12 integer,
    O_C_P13 integer,
    O_C_P14 integer,
    O_C_P15 integer,
    O_C_P16 integer,
    O_C_P17 integer,
    O_C_P18 integer,
    O_COLOR_P_W1 integer,
    O_COLOR_P_W2 integer,
    O_COLOR_P_W3 integer,
    O_COLOR_P_W4 integer,
    O_COLOR_P_W5 integer,
    O_COLOR_P_W6 integer,
    O_COLOR_P_W7 integer,
    O_COLOR_P_W8 integer,
    O_COLOR_P_W9 integer,
    O_COLOR_P_W10 integer,
    O_COLOR_P_W11 integer,
    O_COLOR_P_W12 integer,
    O_COLOR_P_W13 integer,
    O_COLOR_P_W14 integer,
    O_COLOR_P_W15 integer,
    O_COLOR_P_W16 integer,
    O_COLOR_P_W17 integer,
    O_COLOR_P_W18 integer,
    O_C_DN1 integer,
    O_C_DN2 integer,
    O_C_DN3 integer,
    O_C_DN4 integer,
    O_C_DN5 integer,
    O_C_DN6 integer,
    O_C_DN7 integer,
    O_C_DN8 integer,
    O_C_DN9 integer,
    O_C_DN10 integer,
    O_C_DN11 integer,
    O_C_DN12 integer,
    O_C_DN13 integer,
    O_C_DN14 integer,
    O_C_DN15 integer,
    O_C_DN16 integer,
    O_C_DN17 integer,
    O_C_DN18 integer,
    O_COLOR_DN1 integer,
    O_COLOR_DN2 integer,
    O_COLOR_DN3 integer,
    O_COLOR_DN4 integer,
    O_COLOR_DN5 integer,
    O_COLOR_DN6 integer,
    O_COLOR_DN7 integer,
    O_COLOR_DN8 integer,
    O_COLOR_DN9 integer,
    O_COLOR_DN10 integer,
    O_COLOR_DN11 integer,
    O_COLOR_DN12 integer,
    O_COLOR_DN13 integer,
    O_COLOR_DN14 integer,
    O_COLOR_DN15 integer,
    O_COLOR_DN16 integer,
    O_COLOR_DN17 integer,
    O_COLOR_DN18 integer,
    O_C_W1 integer,
    O_C_W2 integer,
    O_C_W3 integer,
    O_C_W4 integer,
    O_C_W5 integer,
    O_C_W6 integer,
    O_C_W7 integer,
    O_C_W8 integer,
    O_C_W9 integer,
    O_C_W10 integer,
    O_C_W11 integer,
    O_C_W12 integer,
    O_C_W13 integer,
    O_C_W14 integer,
    O_C_W15 integer,
    O_C_W16 integer,
    O_C_W17 integer,
    O_C_W18 integer,
    O_COLOR_W1 integer,
    O_COLOR_W2 integer,
    O_COLOR_W3 integer,
    O_COLOR_W4 integer,
    O_COLOR_W5 integer,
    O_COLOR_W6 integer,
    O_COLOR_W7 integer,
    O_COLOR_W8 integer,
    O_COLOR_W9 integer,
    O_COLOR_W10 integer,
    O_COLOR_W11 integer,
    O_COLOR_W12 integer,
    O_COLOR_W13 integer,
    O_COLOR_W14 integer,
    O_COLOR_W15 integer,
    O_COLOR_W16 integer,
    O_COLOR_W17 integer,
    O_COLOR_W18 integer,
    N32 integer,
    N34 integer,
    N36 integer,
    N38 integer,
    N41 integer,
    N43 integer,
    N45 integer,
    N47 integer,
    N48 integer,
    N50 integer,
    OBRIV integer,
    OBRIV_COLOR integer)
as
declare variable I integer;
declare variable STATUS integer;
declare variable NUM_PORTS integer;
begin
i=0;
obriv_color=7;
  for select
   EXTRACT(day from l.data_events)||' '||
DECODE(EXTRACT(month from l.data_events),
             1, '???.',
             2, '????.',
             3, '????',
             4, '????.',
             5, '???',
             6,  '????',
             7,  '????',
             8,  '???.',
             9,  '????.',
             10, '???.',
             11, '????.',
             12,  '???.'
          ),
      EXTRACT(hour from l.data_events)||':'||extract(minute from l.data_events)||':'||TRUNC(extract(SECOND from l.data_events),0),
      case (TRUNC(extract(minute from l.data_events),0))
      when 0 then '15'
        when 1 then '15'
             when 2 then '15'
                  when 3 then '15'
                       when 4 then '15'
                            when 5 then '15'
                                 when 6 then '15'
                                      when 7 then '15'
                                           when 8 then '15'
                                                when 9 then '15'
                                                     when 10 then '15'
                                                          when 11 then '15'
                                                               when 12 then '15'
                                                                    when 13 then '15'
                                                                         when 14 then '15'
                                                                              when 15 then '15'
        when 16 then '30'
             when 17 then '30'
                  when 18 then '30'
                       when 19 then '30'
                            when 20 then '30'
                                  when 21 then '30'
                                        when 22 then '30'
                                              when 23 then '30'
                                                    when 24 then '30'
                                                          when 25 then '30'
                                                                when 26 then '30'
                                                                      when 27 then '30'
                                                                            when 28 then '30'
                                                                                  when 29 then '30'
                                                                                       when 30 then '30'
        when 31 then '45'
             when 32 then '45'
                  when 33 then '45'
                       when 34 then '45'
                            when 35 then '45'
                                 when 36 then '45'
                                      when 37 then '45'
                                           when 38 then '45'
                                                when 39 then '45'
                                                     when 40 then '45'
                                                          when 41 then '45'
                                                               when 42 then '45'
                                                                    when 43 then '45'
                                                                         when 44 then '45'
                                                                              when 45 then '45'
        when 46 then '60'
             when 47 then '60'
                   when 48 then '60'
                         when 49 then '60'
                               when 50 then '60'
                                     when 51 then '60'
                                           when 52 then '60'
                                                 when 53 then '60'
                                                       when 54 then '60'
                                                             when 55 then '60'
                                                                   when 56 then '60'
                                                                         when 57 then '60'
                                                                               when 58 then '60'
                                                                                     when 59 then '60'
      end,
      EXTRACT(hour from l.data_events),

             l.data_events,
             status,
             num_ports
      from liniya1 l
      where l.data_events between current_timestamp-0.5 and current_timestamp  and mod(TRUNC(extract(SECOND from l.data_events),0),15)=0
      order by data_events desc
      into
           :o_data, :o_time, :o_diapazon, :o_hour, :data_events,:status,:num_ports
  do
  begin

    if (:num_ports=1) then O_C_DN4=:status;
    if (:num_ports=2) then O_C_P10=:status;
    if (:num_ports=3) then O_C_DN3=:status;
    if (:num_ports=4) then O_C_P15=:status;
    if (:num_ports=5) then O_C_DN7=:status;
    if (:num_ports=6) then O_C_P14=:status;
    if (:num_ports=7) then O_C_DN6=:status;
    if (:num_ports=8) then O_C_DN8=:status;
    if (:num_ports=9) then O_C_P12=:status;
    if (:num_ports=10) then O_C_DN5=:status;
    if (:num_ports=11) then O_C_P13=:status;
    if (:num_ports=12) then O_C_DN2=:status;
    if (:num_ports=13) then O_C_DN18=:status;
    if (:num_ports=14) then O_C_DN1=:status;
    if (:num_ports=15) then O_C_DN9=:status;
    if (:num_ports=16) then O_C_DN16=:status;
    if (:num_ports=17) then O_C_P3=:status;
    if (:num_ports=18) then O_C_DN17=:status;
    if (:num_ports=19) then O_C_P4=:status;
    if (:num_ports=20) then O_C_DN14=:status;
    if (:num_ports=21) then O_C_P8=:status;
    if (:num_ports=22) then O_C_DN15=:status;
    if (:num_ports=23) then O_C_P7=:status;
    if (:num_ports=24) then O_C_P1=:status;
    if (:num_ports=25) then O_C_DN12=:status;
    if (:num_ports=26) then O_C_P2=:status;
    if (:num_ports=27) then O_C_DN13=:status;
    if (:num_ports=28) then O_C_P6=:status;
    if (:num_ports=29) then O_C_DN10=:status;
    if (:num_ports=30) then O_C_P5=:status;
    if (:num_ports=31) then O_C_DN11=:status;
    if (:num_ports=32) then n32=:status;
    if (:num_ports=33) then O_C_W12=:status;
    if (:num_ports=34) then n34=:status;
    if (:num_ports=35) then O_C_W13=:status;
    if (:num_ports=36) then n36=:status;
    if (:num_ports=37) then O_C_W15=:status;
    if (:num_ports=38) then n38=:status;
    if (:num_ports=39) then O_C_W14=:status;
    if (:num_ports=40) then O_C_W17=:status;
    if (:num_ports=41) then n41=:status;
    if (:num_ports=42) then O_C_W16=:status;
    if (:num_ports=43) then n43=:status;
    if (:num_ports=44) then O_C_W10=:status;
    if (:num_ports=45) then n45=:status;
    if (:num_ports=46) then O_C_W11=:status;
    if (:num_ports=47) then n47=:status;
    if (:num_ports=48) then n48=:status;
    if (:num_ports=49) then O_C_W4=:status;
    if (:num_ports=50) then n50=:status;
    if (:num_ports=51) then O_C_W3=:status;
    if (:num_ports=52) then O_C_P18=:status;
    if (:num_ports=53) then O_C_W2=:status;
    if (:num_ports=54) then O_C_P17=:status;
    if (:num_ports=55) then O_C_W1=:status;
    if (:num_ports=56) then O_C_W6=:status;
    if (:num_ports=57) then O_C_W18=:status;
    if (:num_ports=58) then O_C_W5=:status;
    if (:num_ports=59) then O_C_W9=:status;
    if (:num_ports=60) then O_C_W8=:status;
    if (:num_ports=61) then O_C_P9=:status;
    if (:num_ports=62) then O_C_W7=:status;
    if (:num_ports=63) then O_C_P16=:status;
    if (:num_ports=0) then  O_C_P11=:status;
    if (:num_ports=32) then obriv=:status;




    if (:O_C_P1=0) then O_COLOR_P_W1=3; else O_COLOR_P_W1=50;
    if (:O_C_P2=0) then O_COLOR_P_W2=3; else O_COLOR_P_W2=50;
    if (:O_C_P3=0) then O_COLOR_P_W3=3; else O_COLOR_P_W3=50;
    if (:O_C_P4=0) then O_COLOR_P_W4=3; else O_COLOR_P_W4=50;
    if (:O_C_P5=0) then O_COLOR_P_W5=3; else O_COLOR_P_W5=50;
    if (:O_C_P6=0) then O_COLOR_P_W6=3; else O_COLOR_P_W6=50;
    if (:O_C_P7=0) then O_COLOR_P_W7=3; else O_COLOR_P_W7=50;
    if (:O_C_P8=0) then O_COLOR_P_W8=3; else O_COLOR_P_W8=50;
    if (:O_C_P9=0) then O_COLOR_P_W9=3; else O_COLOR_P_W9=50;
    if (:O_C_P10=0) then O_COLOR_P_W10=3; else O_COLOR_P_W10=50;
    if (:O_C_P11=0) then O_COLOR_P_W11=3; else O_COLOR_P_W11=50;
    if (:O_C_P12=0) then O_COLOR_P_W12=3; else O_COLOR_P_W12=50;
    if (:O_C_P13=0) then O_COLOR_P_W13=3; else O_COLOR_P_W13=50;
    if (:O_C_P14=0) then O_COLOR_P_W14=3; else O_COLOR_P_W14=50;
    if (:O_C_P15=0) then O_COLOR_P_W15=3; else O_COLOR_P_W15=50;
    if (:O_C_P16=0) then O_COLOR_P_W16=3; else O_COLOR_P_W16=50;
    if (:O_C_P17=0) then O_COLOR_P_W17=3; else O_COLOR_P_W17=50;
    if (:O_C_P18=0) then O_COLOR_P_W18=3; else O_COLOR_P_W18=50;

    if (:O_C_DN1=0) then O_COLOR_DN1=3; else O_COLOR_DN1=2;
    if (:O_C_DN2=0) then O_COLOR_DN2=3; else O_COLOR_DN2=2;
    if (:O_C_DN3=0) then O_COLOR_DN3=3; else O_COLOR_DN3=2;
    if (:O_C_DN4=0) then O_COLOR_DN4=3; else O_COLOR_DN4=2;
    if (:O_C_DN5=0) then O_COLOR_DN5=3; else O_COLOR_DN5=2;
    if (:O_C_DN6=0) then O_COLOR_DN6=3; else O_COLOR_DN6=2;
    if (:O_C_DN7=0) then O_COLOR_DN7=3; else O_COLOR_DN7=2;
    if (:O_C_DN8=0) then O_COLOR_DN8=3; else O_COLOR_DN8=2;
    if (:O_C_DN9=0) then O_COLOR_DN9=3; else O_COLOR_DN9=2;
    if (:O_C_DN10=0) then O_COLOR_DN10=3; else O_COLOR_DN10=2;
    if (:O_C_DN11=0) then O_COLOR_DN11=3; else O_COLOR_DN11=2;
    if (:O_C_DN12=0) then O_COLOR_DN12=3; else O_COLOR_DN12=2;
    if (:O_C_DN13=0) then O_COLOR_DN13=3; else O_COLOR_DN13=2;
    if (:O_C_DN14=0) then O_COLOR_DN14=3; else O_COLOR_DN14=2;
    if (:O_C_DN15=0) then O_COLOR_DN15=3; else O_COLOR_DN15=2;
    if (:O_C_DN16=0) then O_COLOR_DN16=3; else O_COLOR_DN16=2;
    if (:O_C_DN17=0) then O_COLOR_DN17=3; else O_COLOR_DN17=2;
    if (:O_C_DN18=0) then O_COLOR_DN18=3; else O_COLOR_DN18=2;

    if (:O_C_W1=0) then O_COLOR_W1=3; else O_COLOR_W1=20;
    if (:O_C_W2=0) then O_COLOR_W2=3; else O_COLOR_W2=20;
    if (:O_C_W3=0) then O_COLOR_W3=3; else O_COLOR_W3=20;
    if (:O_C_W4=0) then O_COLOR_W4=3; else O_COLOR_W4=20;
    if (:O_C_W5=0) then O_COLOR_W5=3; else O_COLOR_W5=20;
    if (:O_C_W6=0) then O_COLOR_W6=3; else O_COLOR_W6=20;
    if (:O_C_W7=0) then O_COLOR_W7=3; else O_COLOR_W7=20;
    if (:O_C_W8=0) then O_COLOR_W8=3; else O_COLOR_W8=20;
    if (:O_C_W9=0) then O_COLOR_W9=3; else O_COLOR_W9=20;
    if (:O_C_W10=0) then O_COLOR_W10=3; else O_COLOR_W10=20;
    if (:O_C_W11=0) then O_COLOR_W11=3; else O_COLOR_W11=20;
    if (:O_C_W12=0) then O_COLOR_W12=3; else O_COLOR_W12=20;
    if (:O_C_W13=0) then O_COLOR_W13=3; else O_COLOR_W13=20;
    if (:O_C_W14=0) then O_COLOR_W14=3; else O_COLOR_W14=20;
    if (:O_C_W15=0) then O_COLOR_W15=3; else O_COLOR_W15=20;
    if (:O_C_W16=0) then O_COLOR_W16=3; else O_COLOR_W16=20;
    if (:O_C_W17=0) then O_COLOR_W17=3; else O_COLOR_W17=20;
    if (:O_C_W18=0) then O_COLOR_W18=3; else O_COLOR_W18=20;



    if (i=63) then
     begin
      suspend;
      i=0;
     end
     else i=i+1;
    end

end
...
Рейтинг: 0 / 0
Запсро на подсчет продолжительности периода
    #38789547
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexeyFVСтруктура таблицы - выше описана.
Правда, что из индексов только PK?
...
Рейтинг: 0 / 0
Запсро на подсчет продолжительности периода
    #38789586
AlexeyFV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadmanAlexeyFVСтруктура таблицы - выше описана.
Правда, что из индексов только PK?
индексированы все поля таблицы.

Query
------------------------------------------------


Plan
------------------------------------------------


Query Time
------------------------------------------------
Prepare : 78,00 ms
Execute : 12386,00 ms
Avg fetch time: 516,08 ms

Memory
------------------------------------------------
Current: 53817688
Max : 56128800
Buffers: 2048

Operations
------------------------------------------------
Read : 12074
Writes : 117
Fetches: 5899158
Marks : 3906


Enchanced Info:
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
| Table Name | Records | Indexed | Non-Indexed | Updates | Deletes | Inserts | Backouts | Purges | Expunges |
| | Total | reads | reads | | | | | | |
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
|LINIYA1 | 0 | 2941376 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
...
Рейтинг: 0 / 0
Запсро на подсчет продолжительности периода
    #38789802
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Какой-то ужоснах, как мне кажется. Выдавай инфу о датчиках в отдельных записях и все. Тогда и добавление датчика вообще никак не затронет метаданные.
...
Рейтинг: 0 / 0
Запсро на подсчет продолжительности периода
    #38789815
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexeyFVНо сейчас ХП для горизонтальной выборки у меня выглядит так.
кто этот кошмар писал, и не стоит-ли его переделать?
...
Рейтинг: 0 / 0
Запсро на подсчет продолжительности периода
    #38789816
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexeyFVиндексированы все поля таблицы.
зачем?
план пустой, потому что вылез за пределы 64к, или еще по каким-то причинам?
...
Рейтинг: 0 / 0
Запсро на подсчет продолжительности периода
    #38790151
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexeyFVwadmanпропущено...

Вот еще на этом этапе стоило спросить совета, потому как не должна сложность "геометрически" расти при правильно спроектированной таблице.
Структура таблицы - выше описана.
Число датчиков на текущий момент 60.
Поскольку состояния датчиков в неустоявщемся переходе могут меняться быстро , то для понимая переходных процессов требуется строить горизонтальную выборку по датчикам в разрезе посекундно.

дата время, датчик 1. датчик 2 ...... датчик 60

с точки зрения уменьшения объема, да эффективнее хранить только переходные моменты, но не всегда даже нормализация таблиц оправдана. Так и в этой ситуации, проще хранить ВЕСЬ объем и делать по нему выборку, нежели добавлять в выборки недостающие данные из пограничных переходов.
Возможно я ошибаюсь. Но сейчас ХП для горизонтальной выборки у меня выглядит так.
...
Может построение таблицы вынести в приложение и выбирать только данные ?
Код: plsql
1.
2.
3.
      select * from liniya1 l
      where l.data_events between current_timestamp-0.5 and current_timestamp
      order by data_events desc

ИМХО проще будет.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Запсро на подсчет продолжительности периода
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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