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

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

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

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

какие-нибудь данные для примера можете привести ? может ли так быть, что для одного и того же датчика два и более раз подряд в поле status будет 1 или 0 (т.е. может ли что-то там "сглючить" в железках) ?
...
Рейтинг: 0 / 0
28.10.2014, 14:03
    #38789296
AlexeyFV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запсро на подсчет продолжительности периода
Dimitry Sibiryakov,
спасибо
...
Рейтинг: 0 / 0
28.10.2014, 14:07
    #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
28.10.2014, 14:11
    #38789322
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запсро на подсчет продолжительности периода
AlexeyFVэто посекундное состояние по датчику, состояние датчика может меняться, но всегда есть длительные однородные состояния
А есть смысл хранить час по секундам и состояниям, когда можно триггером или процедурой обрезать лишние строки и вместо 86тыс записей одну за час?
...
Рейтинг: 0 / 0
28.10.2014, 15:08
    #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
28.10.2014, 15:08
    #38789449
AlexeyFV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запсро на подсчет продолжительности периода
wadmanAlexeyFVэто посекундное состояние по датчику, состояние датчика может меняться, но всегда есть длительные однородные состояния
А есть смысл хранить час по секундам и состояниям, когда можно триггером или процедурой обрезать лишние строки и вместо 86тыс записей одну за час?
тогда усложнится построение горизонтальной развертки по состояниям датчиков.
сейчас я делаю простую выборку , а придется сложную ХП с проверкой пограничных переходов.
Изначально я делал запись только при смене состояний датчика, но с ростом числа датчиков до 50 геометрически выросла сложность ХП для полного горизонтального снимка датчиков по времени.
Датчики собирают состояние по техпроцессу, и нужно знать их состояние в любой момент времени.
...
Рейтинг: 0 / 0
28.10.2014, 15:10
    #38789454
AlexeyFV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запсро на подсчет продолжительности периода
Таблоид,
Спасибо, буду пробовать данное направление.
...
Рейтинг: 0 / 0
28.10.2014, 15:16
    #38789464
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запсро на подсчет продолжительности периода
Хранить в 2 видах? и так и эдак, писать триггером, читать тот вид, который удобней.
...
Рейтинг: 0 / 0
28.10.2014, 15:22
    #38789473
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запсро на подсчет продолжительности периода
AlexeyFVИзначально я делал запись только при смене состояний датчика, но с ростом числа датчиков до 50 геометрически выросла сложность ХП для полного горизонтального снимка датчиков по времени.
Вот еще на этом этапе стоило спросить совета, потому как не должна сложность "геометрически" расти при правильно спроектированной таблице.
...
Рейтинг: 0 / 0
28.10.2014, 15:55
    #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
28.10.2014, 16:04
    #38789547
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запсро на подсчет продолжительности периода
AlexeyFVСтруктура таблицы - выше описана.
Правда, что из индексов только PK?
...
Рейтинг: 0 / 0
28.10.2014, 16:31
    #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
28.10.2014, 19:06
    #38789802
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запсро на подсчет продолжительности периода
Какой-то ужоснах, как мне кажется. Выдавай инфу о датчиках в отдельных записях и все. Тогда и добавление датчика вообще никак не затронет метаданные.
...
Рейтинг: 0 / 0
28.10.2014, 19:40
    #38789815
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запсро на подсчет продолжительности периода
AlexeyFVНо сейчас ХП для горизонтальной выборки у меня выглядит так.
кто этот кошмар писал, и не стоит-ли его переделать?
...
Рейтинг: 0 / 0
28.10.2014, 19:42
    #38789816
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запсро на подсчет продолжительности периода
AlexeyFVиндексированы все поля таблицы.
зачем?
план пустой, потому что вылез за пределы 64к, или еще по каким-то причинам?
...
Рейтинг: 0 / 0
29.10.2014, 08:49
    #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
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Запсро на подсчет продолжительности периода / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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