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
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;
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;
Olhando 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
---- 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;
A 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