तो मैं घंटे के हिसाब से मूल्य तालिका में समेकित (सारांश) मान डालने का प्रयास कर रहा हूं। घंटे के हिसाब से मान डालने के बाद, मैं उसी प्रक्रिया के भीतर दिन के हिसाब से व्यापक योग डालना चाहता हूं। क्या कोई तरीका है कि मैं संग्रहित प्रक्रिया को घंटे तक सम्मिलित कर सकता हूं और उसके बाद 'प्रति घंटा' प्रक्रिया के दौरान डाले गए डेटा को संक्षेप में कर्सर खींच सकता हूं? क्या मुझे पहले लेन-देन करने की आवश्यकता होगी और उसके बाद शीघ्र ही एक और कर्सर बनाना होगा?

नीचे कुछ नमूना डेटा है:

क्वेरी का परिणाम जो पहले से ही घंटे के हिसाब से जोड़ / एकत्र कर रहा है:

SUM (VALUE_TX)   UTC_OFFSET   DATA_DATE    HR
   5              8           902018      1
  10              8           902018      2
   4              8           902018      3

ऊपर दिए गए पहले परिणाम को तालिका में डालने के बाद मैं जो डालना चाहता हूं। मैं इन मानों को उसी तालिका से चित्रित करूँगा जिसे मैं सम्मिलित करूँगा।

SUM (VALUE_TX)   UTC_OFFSET   DATA_DATE    HR
   19                8           902018    null

मैं निम्नलिखित करने के बारे में सोच रहा था लेकिन मुझे यकीन नहीं है कि यह करने का यह सबसे अच्छा तरीका है या नहीं। मैं दूसरा कर्सर बनाने के लिए डेटा_डेट द्वारा समूह में जा रहा था।

Create or replace procedure AGG_HOURLY_DAILY IS
CURSOR c1 is
Select sum(value_Tx) as sum_of_values
     , utc_offset
     , data_date
     , hr
  from value
 group by data_date, utc_offset, hr
where HR is not null;
l_var c1%ROWTYPE;
CURSOR c2 is
Select sum(value_tx)
     , utc_offset
     , data_date
     , hr
 group by data_date, utc_offset, hr
Where HR is null;
k_var c2%rowtype;
BEGIN
Open C1;
LOOP;
  FETCH c1 into l_var;
 EXIT WHEN c1%NOTFOUND;
  Insert into value(value_id, value_tx, utc_offset, data_date, hr)
             values(null, l_var.sum_of_values, l_var.utc_offset, l_var.data_date, l_var.hr);
END LOOP;
CLOSE C1;
OPEN C2;
LOOP;
  FETCH c2 into k_var;
 EXIT WHEN c2%NOTFOUND;
  Insert into value(value_id, value_tx, utc_offset, data_date, hr)
             values(null, l_var.sum_of_values, l_var.utc_offset, l_var.data_date, l_var.hr);
END LOOP;
Close c1;
Close c2;
END AGG_HOURLY_DAILY;

नोट: Value_ID मेरे द्वारा बनाए गए अनुक्रम/ट्रिगर द्वारा स्वतः उत्पन्न होता है

1
John Wick 23 अप्रैल 2018, 18:18

2 जवाब

सबसे बढ़िया उत्तर

पहले चरण में, कर्सर को साधारण INSERT ... SELECT स्टेटमेंट से बदलें :

  Insert into value( value_tx, utc_offset, data_date, hr)
  SELECT sum(value_Tx) as sum_of_values
     , utc_offset
     , data_date
     , hr
  from value
 group by data_date, utc_offset, hr
where HR is not null;

Insert into value( value_tx, utc_offset, data_date, hr)
Select sum(value_tx)
     , utc_offset
     , data_date
     , hr
 group by data_date, utc_offset, hr
Where HR is null;

इस सरलीकरण के लिए धन्यवाद, यह देखना आसान है कि दोनों प्रश्न केवल एक तत्व में भिन्न हैं: HR is NULL और HR is NOT NULL। तो दो पंक्तियों को सम्मिलित करने वाले उपरोक्त दो प्रश्नों को एक में सरल बनाया जा सकता है जो समान दो पंक्तियों को सम्मिलित करता है:

Insert into value( value_tx, utc_offset, data_date, hr)
SELECT sum_tx, utc_offset, data_date, hr
FROM (
   Select CASE WHEN hr IS NULL THEN 1 ELSE 2 END as xxx
            , sum(value_tx) as sum_tx
            , utc_offset
            , data_date
            , hr
   group by CASE WHEN hr IS NULL THEN 1 ELSE 2 END,
         data_date, utc_offset, hr
)
;

तो मुझे इसके लिए पीएल/एसक्यूएल की आवश्यकता नहीं होगी? क्या पीएल/एसक्यूएल का उपयोग करके मैं ऐसा कर सकता हूं?

आप इसे प्रक्रिया में कर सकते हैं, आप इसे बिना किसी प्रक्रिया के कर सकते हैं।
यदि आप एक प्रक्रिया करना चाहते हैं, तो बस करें:

Create or replace procedure AGG_HOURLY_DAILY IS
BEGIN
  Insert into value( value_tx, utc_offset, data_date, hr)
  SELECT sum_tx, utc_offset, data_date, hr
    FROM (
       Select CASE WHEN hr IS NULL THEN 1 ELSE 2 END as xxx
                , sum(value_tx) as sum_tx
                , utc_offset
                , data_date
                , hr
       group by CASE WHEN hr IS NULL THEN 1 ELSE 2 END,
             data_date, utc_offset, hr
    )
    ;
END;
/
1
krokodilko 23 अप्रैल 2018, 20:30

शायद आप कुछ ऐसा चाहते हैं:

with demo (value_tx, utc_offset, data_date, hr)
as   ( select 1, 8, '902018', 1 from dual union all
       select 2, 8, '902018', 1 from dual union all
       select 2, 8, '902018', 1 from dual union all
       select 4, 8, '902018', 2 from dual union all
       select 6, 8, '902018', 2 from dual union all
       select 1, 8, '902018', 3 from dual union all
       select 2, 8, '902018', 3 from dual union all
       select 1, 8, '902018', 3 from dual )
select sum(value_tx), utc_offset, data_date, hr
from   demo
group by grouping sets ((utc_offset, data_date, hr), (utc_offset, data_date))
order by hr nulls last;

SUM(VALUE_TX) UTC_OFFSET DATA_DATE         HR
------------- ---------- --------- ----------
            5          8 902018             1
           10          8 902018             2
            4          8 902018             3
           19          8 902018    

GROUPING SETS क्लॉज अनिवार्य रूप से कह रहा है कि आप दो GROUP BY ऑपरेशन चाहते हैं: एक (utc_offset, data_date, hr) पर और एक (utc_offset, data_date) पर।

दस्तावेज़ीकरण में और पढ़ें

2
William Robertson 23 अप्रैल 2018, 19:48