मैं डेटा के समूह को लाने की कोशिश कर रहा हूं जिसमें सूची में और पिछले एन महीनों में ए/सी नंबर है। लेकिन जब मैंने नीचे दी गई क्वेरी की कोशिश की, तो यह मुझे त्रुटि दे रहा है!

नमूना डेटा:

date      refnumber seq_no txt   load_dt
20200310  016       01     emp1  20200309
20200310  016       01     emp1  20200305
20200310  016       02     row2  20200309
20200310  016       02     row2  20200305
20200310  016       03     row3  20200309
20200310  016       04     act   20200309
20200310  016       04     act   20200305
20200310  016       05     row4  20200309
20200310  016       05     row5  20200309
20200310  018       01     emp1  20200309
20200310  018       01     emp1  20200305
20200310  018       02     row2  20200309
20200310  018       02     row2  20200305
20200310  018       03     row3  20200309
20200310  018       04     row4  20200309
20200310  018       04     row4  20200305
20200310  018       05     row5  20200309
20200310  018       05     row5  20200305 

मुझे यह जांचने की आवश्यकता है कि क्या text contains act और load_dt is max of available load dt और फिर पूरे समूह को उन अनुक्रमों के साथ लाएं और फिर सभी मानों को सम्मिलित करें

नमूना आउटपुट:

date     ref_number message_txt              load_dt
20200310 016        emp1|row2|row3|act|row5  20200309

क्वेरी मैंने अब तक कोशिश की है:

SELECT
DATE, REFNUMBER,
LISTAGG(CAST(TEXT AS VARCHAR(30000)), '|') WITHIN GROUP (ORDER BY CAST(SEQ_NO AS INT)) AS MESSAGE_TEXT FROM <table>
WHERE (DATE(date) BETWEEN (DATE('2020-03-10')-18 MONTHS)  AND (DATE('2020-03-10')-1))
GROUP BY DATE, NUMBER
HAVING COUNT(
CASE WHEN text IN (comma separated list of records)
THEN 1 END
) > 0
ORDER BY DATE(DATE)
  • जब मैंने कम महीनों के लिए कोशिश की, तो यह ठीक काम कर रहा है लेकिन डुप्लिकेट को खत्म नहीं कर रहा है

  • जब मैंने 18 महीने कहने की कोशिश की, तो यह त्रुटि से नीचे है:

DB2 SQL Error: SQLCODE=-1585, SQLSTATE=54048, SQLERRMC=null, DRIVER=3.71.22

अग्रिम में धन्यवाद !

0
Harinie R 19 मार्च 2020, 07:28

2 जवाब

त्रुटि संदेश देखें

db2 ? SQL1585

SQL1585N  A temporary table could not be created because there is no
      available system temporary table space that has a compatible page
      size.

यह स्पष्ट रूप से आपको समस्या की ओर इशारा करता है - व्यवस्थापक से संपर्क करें और उसे उपयुक्त पृष्ठ आकार के साथ एक अस्थायी टेबलस्पेस जोड़ने के लिए कहें।

लिस्टैग में विशिष्ट के लिए समर्थन डीबी2 11.1 (यूनिक्स लिनक्स और विंडोज के लिए) में जोड़ा गया है। यदि आप Db2 के लिए किसी अन्य संस्करण या प्लेटफॉर्म का उपयोग करते हैं तो कृपया इसे निर्दिष्ट करें।

1
MichaelTiefenbacher 19 मार्च 2020, 09:25
मुझे अभी पता चला है कि load_dt नामक एक और फ़ील्ड होने जा रहा है और मुझे उस समूह को पुनर्प्राप्त करने की आवश्यकता है जिसे हाल ही में लोड किया गया है यानी -> max(load_dt) जो डुप्लिकेट को हटा देगा .... अभी भी इस तर्क को आजमा रहा है - अपेक्षित आउटपुट नहीं मिल रहा है
 – 
Harinie R
19 मार्च 2020, 10:06
अपने पर्यावरण के बारे में निश्चित नहीं है, लेकिन कुछ इस तरह का प्रयास करें WHERE load_dt = (अपनी तालिका से अधिकतम (load_dt) चुनें)
 – 
MichaelTiefenbacher
19 मार्च 2020, 21:16
धन्यवाद माइकल, लेकिन मुझे प्रत्येक तिथि के अधिकतम (load_dt) के रिकॉर्ड लाने होंगे और अब मैंने इसे एक जॉइन कंडीशन के साथ हल किया है। यह अब ठीक काम कर रहा है! मेरे पास एकमात्र समस्या है अस्थायी तालिका त्रुटि ... सुनिश्चित नहीं है कि व्यवस्थापक से कैसे संपर्क करें, क्या कोई अन्य काम है ... जैसे पहले समूहों को फ़िल्टर करें फिर एकत्रीकरण करें? क्योंकि फ़िल्टर करने के बाद रिकॉर्ड्स की संख्या बहुत कम होगी और कॉन्सट के लिए आसान होगी...
 – 
Harinie R
20 मार्च 2020, 05:20
वर्कअराउंड न करें, इनमें हमेशा कमियां होंगी। व्यवस्थापक का पता लगाने के लिए एक विकल्प होना चाहिए - अन्य स्थितियों के लिए भी आपको उसकी आवश्यकता होगी ... कभी भी कम मत समझो कि एक डीबीए आपके लिए क्या कर सकता है।
 – 
MichaelTiefenbacher
20 मार्च 2020, 08:55
हाँ मिल गया माइकल, अब मैं हाइव में अपनी क्वेरी को फिर से लिखने की योजना बना रहा हूं :(
 – 
Harinie R
20 मार्च 2020, 17:12

इसे इस तरह आजमाएं:

WITH TAB (date, refnumber, seq_no, text) AS
(
VALUES 
  ('20200310', '016', '01', 'emp1')
, ('20200310', '016', '01', 'emp1')
, ('20200310', '016', '02', 'row2')
, ('20200310', '016', '02', 'row2')
, ('20200310', '016', '03', 'row3')
, ('20200310', '016', '04', 'act ')
, ('20200310', '016', '04', 'act ')
, ('20200310', '016', '05', 'row4')
, ('20200310', '016', '05', 'row5')
, ('20200310', '018', '01', 'emp1')
, ('20200310', '018', '01', 'emp1')
, ('20200310', '018', '02', 'row2')
, ('20200310', '018', '02', 'row2')
, ('20200310', '018', '03', 'row3')
, ('20200310', '018', '04', 'row4')
, ('20200310', '018', '04', 'row4')
, ('20200310', '018', '05', 'row4')
, ('20200310', '018', '05', 'row5')
)

SELECT
  DATE, REFNUMBER
, LISTAGG(CAST(TEXT AS VARCHAR(3000)), '|') WITHIN GROUP (ORDER BY CAST(SEQ_NO AS INT)) AS MESSAGE_TEXT 
FROM
(
SELECT DISTINCT DATE(TO_DATE(DATE, 'YYYYMMDD')) AS DATE, REFNUMBER, SEQ_NO, TEXT
FROM TAB
--WHERE DATE(TO_DATE(date, 'YYYYMMDD')) BETWEEN DATE('2020-03-10') - 18 MONTHS AND DATE('2020-03-10') - 1
)
GROUP BY DATE, REFNUMBER
--HAVING COUNT(CASE WHEN text IN (comma separated list of records) THEN 1 END) > 0
ORDER BY DATE;

परिणाम है:

|DATE      |REFNUMBER|MESSAGE_TEXT                                                                                        |
|----------|---------|----------------------------------------------------------------------------------------------------|
|2020-03-10|016      |emp1|row2|row3|act |row4|row5                                                                       |
|2020-03-10|018      |emp1|row2|row3|row4|row4|row5                                                                       |
1
Mark Barinstein 19 मार्च 2020, 10:57