SQL contendo um período de campo (a hora de início, o tempo final) e conjunto para fazer um processo de gravação

Pergunta de um grupo de amigos:

Seu blog ligações SQL período de tempo com um problema e tomar o conjunto, mesclar https://blog.csdn.net/Seandba/article/details/105152412 

Q: o comprimento total do canal aberto é calculado, enquanto há passagem aberta, mesmo se houver uma abertura terminal, dificuldade é sobreposta compreende vários terminais Horas

aa128bd9b772d921814e068c67d5e7f4

Os dados do teste Pergunta

- um problema, os dados de ensaio - o cálculo do comprimento total da abertura (h) 
TRUNCAMENTO TABELA XCP; 
valores INSERÇÃO EM XCP (, 'A1', TO_DATE ('20, 200317 01:00:00' , 'DDMMAAAA HH24' 1' .: Mi O: SS '), TO_DATE (' 20200317 06:00:00 '' DDMMAAAA HH24: mi O: SS ')); 
valores INSERÇÃO EM XCP (' 2 '', A1 'TO_DATE (' 01:00:00 20200317', 'DDMMAAAA HH24: mi O: SS'), TO_DATE ('20, 200317 06:00:00' , 'DDMMAAAA HH24: mi O: SS')); 
valores INSERÇÃO EM XCP ( '2' 'A1', TO_DATE ('01 20200317 : 00: 00 '' DDMMAAAA HH24: mi O: SS '), TO_DATE (' 20200317 08:00:00 '' DDMMAAAA HH24: mi O: SS ')); 
valores INSERÇÃO EM XCP (' 2 '', A1 ' , to_date ( '20200317 02:00:00', 'yyyymmdd HH24: mi: ss'), to_date ( '20200317 07:00:00', 'yyyymmdd HH24: mi: ss'));
inserir valores XCP ( '2' 'A1', to_date ( '20200317 03:00:00', 'yyyymmdd HH24: mi: ss'), to_date ( '20200317 07:00:00', 'yyyymmdd HH24: mi : ss'));

inserir valores XCP ( '2' 'A1', to_date ( '20200317 05:00:00', 'yyyymmdd HH24: mi: ss'), to_date ( '20200317 09:00:00', 'yyyymmdd HH24: mi : ss ')); 
inserir valores XCP ( '3', 'A1', to_date ( '20200317 09:00:00', 'yyyymmdd HH24: mi: ss'), to_date ( '20200317 11:00:00', 'yyyymmdd HH24: mi : ss')); 
inserir valores XCP ( '3', 'A1', to_date ( '20200317 00:00:00', 'yyyymmdd HH24: mi: ss'), to_date ( '20200317 13:00:00', 'yyyymmdd HH24: mi : ss')); 

inserir valores XCP ( '2' 'A1', to_date ( '20200317 14:00:00', 'yyyymmdd HH24: mi: ss'), to_date ( '20200317 19:00:00', 'yyyymmdd HH24: mi : ss ')); 
inserir valores XCP ( '3', 'A1', to_date ('
inserir valores XCP ( '3', 'A1', to_date ('
inserir valores XCP ( '3', 'A1', to_date ( '20200317 18:00:00', 'yyyymmdd HH24: mi: ss'), to_date ( '20200317 21:00:00', 'yyyymmdd HH24: mi : ss')); 
commit; 

* SELECT FROM xcp;

image2

A questão central é buscar operações de união entre vários registros, escrevi o seguinte sql

-. Problemas 1 
a COM TMP 1 a AS (- tomando todos os nós do tempo 
do Canal SELECT, o TEMPO BEGIN_TIME FROM XCP 
a UNIÃO do Canal SELECT, FROM XCP END_TIME 
a UNIÃO do Canal SELECT, MIN (BEGIN_TIME) a partir do canal XCP o GROUP BY 
a UNIÃO do Canal SELECT, MAX (END_TIME) FROM GROUP BY Canal XCP), 

TMP 2 aS (- cada vez que um nó está conectado para o próximo nó período formado 
a.channel SELECT, a.time, LEAD (a.time , 1) SOBRE (partição POR ORDEM dE a.channel um .time) nEXTTIME 
o PARTIR dE uM TMP 1), 

TMP3 o aS (- tendo uma mediana de cada período 
b.channel SELECT, b.TIME, b.nexttime, ( b.nexttime-b.time) midtime /2+b.time 
B TMP 2 a 
dA ONDE b.nexttime o é a não nulo), 

TMP4 os por (- se o valor no registo inicial do período de tempo que o tempo de canal ou canais de abertura não é aberta 
SELECCIONAR c * ,.
O quando existir o caso (o DE. 1 a seleccionar O XCP o ONDE c.midtime o ENTRE o.begin_time o E o.end_time) então o fim * 0. 1 a ELSE
(C.nexttime-c.time) 24 * DURAÇÃO 
a DE TMP3 C) 

canais SELECT NVL (d.channel, a duração total '), D.TIME hora de início, d.nexttime tempo final, 
o somatório (DURAÇÃO) "canal em tempo- (h) "a partir de D TMP4 
GROUP BY ROLLUP ((d.channel, D.TIME, d.nexttime)) 
ORDER por 2;

09e02bd2c2d7e12249c24dc5380b754Olhando muito sql lixo, plano de execução deve recusar-se a gravá-lo para consulta mais tarde

Princípio, é tempo de nós, não sobre o período de tempo entre dois nós tempo, um valor intermediário para a consulta da tabela registro original, se, após esse tempo e pertencem ao conjunto, e, em seguida, registrado nos requisitos definidos e e


Pergunta 2: Quando você abrir o canal de buscar longo 17

-问题2,测试数据-计算27号开放时长(小时) 
TRUNCAMENTO TABELA xcp; 
inserir valores XCP ('13' , 'A1', to_date ( '20200314 08:00:00', 'yyyymmdd HH24: mi: ss'), to_date ( '20200315 09:00:00', 'yyyymmdd HH24: mi : ss')); 
inserir valores XCP ('14' , 'A1', to_date ( '20200317 08:00:00', 'yyyymmdd HH24: mi: ss'), to_date ( '20200317 09:00:00', 'yyyymmdd HH24: mi : ss')); 
inserir valores XCP ('15' , 'A1', to_date ( '20200316 03:00:00', 'yyyymmdd HH24: mi: ss'), to_date ( '20200317 05:00:00', 'yyyymmdd HH24: mi : ss')); 
inserir valores XCP ('16' , 'A1', to_date ( '20200317 08:00:00', 'yyyymmdd HH24: mi: ss'), to_date ( '20200318 10:00:00', 'yyyymmdd HH24: mi : ss')); 
inserir valores XCP ('18' , 'A1', to_date ( '20200320 08:00:00', 'yyyymmdd HH24: mi: ss'), to_date ( '20200321 10:00:00', 'yyyymmdd HH24: mi : ss')); 
commit;

* SELECT FROM ORDER BY xcp BEGIN_TIME

image5SQL como se segue:

---- Problemas 2 
do COM TMP 1 a AS (- todo o tempo necessário para se juntar a nós de 17 tomadas 00:00 17 e 24 em ambos os momentos 
do Canal SELECT, o TEMPO BEGIN_TIME FROM XCP 
a UNIÃO do Canal SELECT, FROM XCP END_TIME 
a UNIÃO do Canal SELECT, MIN (BEGIN_TIME) a DE XCP GROUP BY Canal 
a UNIÃO o Canal SELECT, MAX (END_TIME) a DE XCP o POR canal do grupo 
a UNIÃO a seleccionar o canal DISTINTA, TO_DATE ('20, 200,317' , 'DDMMAAAA') a DE XCP 
a UNIÃO a seleccionar o canal DISTINTA, TO_DATE ('20, 200,318' , ' DDMMAAAA ') a dE XCP), 

TMP 2 aS (- cada vez que um nó está conectado para o próximo nó período formado 
a.channel SELECT, a.time, LEAD (a.time , 1) SOBRE o (POR PARTITION a.channel POR ORDEM a.time) nEXTTIME 
o PARTIR dE uM TMP 1), 

TMP3 o aS (- tendo uma mediana de cada período 
SELECCIONAR b.channel, b.TIME, b.nexttime, ( b.nexttime-b.time) /2+b.time midtime 
a DE TMP 2 b
O IS b.nexttime o NOT NULL WHERE 
o E TO_CHAR (b.TIME, 'YYYYMMDD') = 20200317), 

TMP4 o AS (- se o valor no registro original do período de tempo que o canal ou canais de tempo de abertura não é aberto 
selecione C *. , 
o caso, o QUANDO EXISTE (a DE. 1 a seleccionar o XCP o ONDE c.midtime o ENTRE o.begin_time o E o.end_time) então o fim * 0. 1 a ELSE 
(c.nexttime-c.time) 24 * DURAÇÃO 
a DE TMP3 C) 

o SELECT NVL (D. do canal, a duração total ') canais, D.TIME a hora de início, d.nexttime tempo final, 
a soma (dURAÇÃO) "no-passagem tempo (horas)" a partir de D TMP4 
GROUP BY ROLLUP ((d.channel, D.TIME, D .nexttime)) 
ORDER por 2;

imagemA idéia é levar o ponto de tempo em que o primeiro passo do ponto de tempo adicionados separadamente em 0:24 no ponto 17 a





otimização:

O código de cinco varredura completa da tabela, a eficiência de lixo, pequeno forte oitavo caso oposto consideração, pequeno forte ligação com a idéia, a capacidade de sintonizar uma varredura completa da tabela, como se segue

  - 8, caracterizada por: a hora de início da gravação é maior do que o tempo do fim da secção de gravação, em seguida, colocar para baixo essa parte do tempo, e finalmente a perder 
o COM tmp o AS ( 
SELECT a.channel, a.begin_time, a.end_time, 
(LEAD (a.begin_time, 1) SOBRE (partição POR ORDEM dE a.channel BEGIN_TIME, end_time) - a.end_time) * 24 hoursto_next_begin_time - um intervalo de tempo para o registo seguinte, se ela é positiva é o caso 8 
a partir de um xcp ) 

o SELECT (MAX (END_TIME) -MIN (BEGIN_TIME)) * 24 - soma (a DECODIFICAR (sinal (hoursto_next_begin_time) ,. 1, hoursto_next_begin_time, 0)) tempo de abertura do canal 
DE tmp aa

imagem

Acho que você gosta

Origin www.cnblogs.com/yongestcat/p/12590154.html
Recomendado
Clasificación