Как я могу выполнить один запрос с разными значениями одновременно? - PullRequest
0 голосов
/ 21 октября 2018

У меня ниже запрос, где мне нужно каждый раз обновлять дату и время.Может ли кто-нибудь помочь мне выяснить, каким образом я могу выполнить один запрос и извлечь результаты для нескольких входных данных?

select channel
       ,TO_CHAR(ECH.CH_VALIDFROM,'dd/mm/yyyy')
       , count(1) count 
from emcdu.ext_contract_history ech 
where ch_status='a' 
and CH_VALIDFROM BETWEEN TO_DATE('17/10/2018 20:21:00','dd/mm/yyyy hh24:mi:ss') 
                 AND TO_DATE ('17/10/2018 21:16:00','dd/mm/yyyy hh24:mi:ss') 
and ch_validfrom=(select min(CH_VALIDFROM) 
                  from emcdu.ext_contract_history 
                  where co_id=ech.co_id 
                  and ch_status='a') 
group by channel
       , TO_CHAR(ECH.CH_VALIDFROM,'dd/mm/yyyy');

У меня есть значения даты и времени ниже:

('16/10/2018 11:41:00','dd/mm/yyyy hh24:mi:ss') AND TO_DATE
('16/10/2018 12:01:00','dd/mm/yyyy hh24:mi:ss')

('16/10/2018 12:38:00','dd/mm/yyyy hh24:mi:ss')  AND TO_DATE 
('16/10/2018 13:13:00','dd/mm/yyyy hh24:mi:ss') 

('16/10/2018 20:21:00','dd/mm/yyyy hh24:mi:ss')   AND TO_DATE
('16/10/2018 20:30:00','dd/mm/yyyy hh24:mi:ss')

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Как насчет немного ИЛИ (т.е. поместите эти условия в одно и то же предложение WHERE, используя оператор OR):

select   channel
       , to_char(ech.ch_validfrom, 'dd/mm/yyyy')
       , count(*) count 
from emcdu.ext_contract_history ech 
where ch_status = 'a' 
and (   ch_validfrom between to_date('17/10/2018 20:21:00','dd/mm/yyyy hh24:mi:ss') 
                         and to_date('17/10/2018 21:16:00','dd/mm/yyyy hh24:mi:ss') 
     or ch_validfrom between to_date('16/10/2018 11:41:00','dd/mm/yyyy hh24:mi:ss') 
                         and to_date('16/10/2018 12:01:00','dd/mm/yyyy hh24:mi:ss')
     or ch_validfrom between to_date('16/10/2018 12:38:00','dd/mm/yyyy hh24:mi:ss')  
                         and to_date('16/10/2018 13:13:00','dd/mm/yyyy hh24:mi:ss') 
     or ch_validfrom between to_date('16/10/2018 20:21:00','dd/mm/yyyy hh24:mi:ss')   
                         and to_date('16/10/2018 20:30:00','dd/mm/yyyy hh24:mi:ss')
    )
and ch_validfrom=(select min(ch_validfrom) 
                  from emcdu.ext_contract_history 
                  where co_id = ech.co_id 
                  and ch_status = 'a') 
group by channel
       , to_char(ech.ch_validfrom, 'dd/mm/yyyy');
0 голосов
/ 21 октября 2018

Из того, что я понял из ваших комментариев, вы можете определить идентификатор диапазона для каждого диапазона и включить его в group by и поместить эти диапазоны в CTE (или таблицу диапазонов)

with inputs
AS
(
SELECT 1 in_range_id,
       TO_DATE('16/10/2018 11:41:00','dd/mm/yyyy hh24:mi:ss') as start_dtime,
       TO_DATE('16/10/2018 12:01:00','dd/mm/yyyy hh24:mi:ss') as end_dtime

FROM dual
UNION ALL
SELECT 2,
       TO_DATE('16/10/2018 12:38:00','dd/mm/yyyy hh24:mi:ss'),
       TO_DATE('16/10/2018 13:13:00','dd/mm/yyyy hh24:mi:ss')
FROM dual
UNION ALL
SELECT 3,
       TO_DATE('16/10/2018 20:21:00','dd/mm/yyyy hh24:mi:ss'),
       TO_DATE('16/10/2018 20:30:00','dd/mm/yyyy hh24:mi:ss')
FROM dual
)
select in_range_id
       ,channel
       ,TO_CHAR(ECH.CH_VALIDFROM,'dd/mm/yyyy')
       , count(1) count 
from emcdu.ext_contract_history ech cross join inputs i
where ch_status='a' 
and ch_validfrom BETWEEN  i.start_dtime 
                     AND  i.end_dtime
and ch_validfrom=(select min(CH_VALIDFROM) 
                  from emcdu.ext_contract_history 
                  where co_id=ech.co_id 
                  and ch_status='a') 
group by in_range_id
         ,channel
         ,TO_CHAR(ECH.CH_VALIDFROM,'dd/mm/yyyy');
...